diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2014-10-20 14:08:16 +0200 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2014-11-10 12:40:42 +0100 |
commit | c197787ced5b42bde224d9ee70473d87a824119a (patch) | |
tree | 4040c515d4ab287ba05104d1d1efd4261d3ec66b /drivers/mmc | |
parent | 076ec38a58584dc85c837bd52b4ec3d9cd02b393 (diff) | |
download | blackbird-obmc-linux-c197787ced5b42bde224d9ee70473d87a824119a.tar.gz blackbird-obmc-linux-c197787ced5b42bde224d9ee70473d87a824119a.zip |
mmc: core: Let's callers of from mmc_get_ext_csd() do error handling
The callers of mmc_get_ext_csd() need the flexibility to handle errors
themselves, because they behave differently.
Let's clean up mmc_get_ext_csd() with its friends and adopt the error
handling as stated above.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/core/mmc.c | 70 |
1 files changed, 31 insertions, 39 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 13f8e3672606..fe801e612b1f 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -188,10 +188,8 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd) BUG_ON(!card); BUG_ON(!new_ext_csd); - *new_ext_csd = NULL; - if (!mmc_can_ext_csd(card)) - return 0; + return -EOPNOTSUPP; /* * As the ext_csd is so large and mostly unused, we don't store the @@ -202,32 +200,9 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd) return -ENOMEM; err = mmc_send_ext_csd(card, ext_csd); - if (err) { + if (err) kfree(ext_csd); - *new_ext_csd = NULL; - - /* If the host or the card can't do the switch, - * fail more gracefully. */ - if ((err != -EINVAL) - && (err != -ENOSYS) - && (err != -EFAULT)) - return err; - - /* - * High capacity cards should have this "magic" size - * stored in their CSD. - */ - if (card->csd.capacity == (4096 * 512)) { - pr_err("%s: unable to read EXT_CSD " - "on a possible high capacity card. " - "Card will be ignored.\n", - mmc_hostname(card->host)); - } else { - pr_warn("%s: unable to read EXT_CSD, performance might suffer\n", - mmc_hostname(card->host)); - err = 0; - } - } else + else *new_ext_csd = ext_csd; return err; @@ -395,9 +370,6 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) BUG_ON(!card); - if (!ext_csd) - return 0; - /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */ card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; if (card->csd.structure == 3) { @@ -639,12 +611,36 @@ out: static int mmc_read_ext_csd(struct mmc_card *card) { - u8 *ext_csd = NULL; + u8 *ext_csd; int err; + if (!mmc_can_ext_csd(card)) + return 0; + err = mmc_get_ext_csd(card, &ext_csd); - if (err) + if (err) { + /* If the host or the card can't do the switch, + * fail more gracefully. */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) + return err; + + /* + * High capacity cards should have this "magic" size + * stored in their CSD. + */ + if (card->csd.capacity == (4096 * 512)) { + pr_err("%s: unable to read EXT_CSD on a possible high capacity card. Card will be ignored.\n", + mmc_hostname(card->host)); + } else { + pr_warn("%s: unable to read EXT_CSD, performance might suffer\n", + mmc_hostname(card->host)); + err = 0; + } + return err; + } err = mmc_decode_ext_csd(card, ext_csd); kfree(ext_csd); @@ -660,11 +656,8 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) return 0; err = mmc_get_ext_csd(card, &bw_ext_csd); - - if (err || bw_ext_csd == NULL) { - err = -EINVAL; - goto out; - } + if (err) + return err; /* only compare read only fields */ err = !((card->ext_csd.raw_partition_support == @@ -723,7 +716,6 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) if (err) err = -EINVAL; -out: kfree(bw_ext_csd); return err; } |