Re: [PATCH v2 1/3] mmc: core: Calculate the discard arg only once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 6 Feb 2019 at 12:28, Avri Altman <avri.altman@xxxxxxx> wrote:
>
> In MMC, the discard arg is a read-only ext_csd parameter - set it once
> on card init. To be consistent, do that for SD as well even though its
> discard arg is always 0x0.
>
> Signed-off-by: Avri Altman <avri.altman@xxxxxxx>

Applied for next, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/core/block.c | 12 +++---------
>  drivers/mmc/core/core.c  |  4 ++--
>  drivers/mmc/core/mmc.c   |  8 ++++++++
>  drivers/mmc/core/sd.c    |  2 ++
>  include/linux/mmc/card.h |  1 +
>  include/linux/mmc/sd.h   |  5 +++++
>  6 files changed, 21 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index b08fb91..131e80e 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1124,7 +1124,7 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
>  {
>         struct mmc_blk_data *md = mq->blkdata;
>         struct mmc_card *card = md->queue.card;
> -       unsigned int from, nr, arg;
> +       unsigned int from, nr;
>         int err = 0, type = MMC_BLK_DISCARD;
>         blk_status_t status = BLK_STS_OK;
>
> @@ -1136,24 +1136,18 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
>         from = blk_rq_pos(req);
>         nr = blk_rq_sectors(req);
>
> -       if (mmc_can_discard(card))
> -               arg = MMC_DISCARD_ARG;
> -       else if (mmc_can_trim(card))
> -               arg = MMC_TRIM_ARG;
> -       else
> -               arg = MMC_ERASE_ARG;
>         do {
>                 err = 0;
>                 if (card->quirks & MMC_QUIRK_INAND_CMD38) {
>                         err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>                                          INAND_CMD38_ARG_EXT_CSD,
> -                                        arg == MMC_TRIM_ARG ?
> +                                        card->erase_arg == MMC_TRIM_ARG ?
>                                          INAND_CMD38_ARG_TRIM :
>                                          INAND_CMD38_ARG_ERASE,
>                                          0);
>                 }
>                 if (!err)
> -                       err = mmc_erase(card, from, nr, arg);
> +                       err = mmc_erase(card, from, nr, card->erase_arg);
>         } while (err == -EIO && !mmc_blk_reset(md, card->host, type));
>         if (err)
>                 status = BLK_STS_IOERR;
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 5bd58b9..de0f1a1 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -2164,7 +2164,7 @@ static unsigned int mmc_align_erase_size(struct mmc_card *card,
>   * @card: card to erase
>   * @from: first sector to erase
>   * @nr: number of sectors to erase
> - * @arg: erase command argument (SD supports only %MMC_ERASE_ARG)
> + * @arg: erase command argument (SD supports only %SD_ERASE_ARG)
>   *
>   * Caller must claim host before calling this function.
>   */
> @@ -2181,7 +2181,7 @@ int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr,
>         if (!card->erase_size)
>                 return -EOPNOTSUPP;
>
> -       if (mmc_card_sd(card) && arg != MMC_ERASE_ARG)
> +       if (mmc_card_sd(card) && arg != SD_ERASE_ARG)
>                 return -EOPNOTSUPP;
>
>         if ((arg & MMC_SECURE_ARGS) &&
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index da892a5..09c688f 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1743,6 +1743,14 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
>                         card->ext_csd.power_off_notification = EXT_CSD_POWER_ON;
>         }
>
> +       /* set erase_arg */
> +       if (mmc_can_discard(card))
> +               card->erase_arg = MMC_DISCARD_ARG;
> +       else if (mmc_can_trim(card))
> +               card->erase_arg = MMC_TRIM_ARG;
> +       else
> +               card->erase_arg = MMC_ERASE_ARG;
> +
>         /*
>          * Select timing interface
>          */
> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
> index d0d9f90..bd48b28 100644
> --- a/drivers/mmc/core/sd.c
> +++ b/drivers/mmc/core/sd.c
> @@ -271,6 +271,8 @@ static int mmc_read_ssr(struct mmc_card *card)
>                 }
>         }
>
> +       card->erase_arg = SD_ERASE_ARG;
> +
>         return 0;
>  }
>
> diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
> index de73778..8f429b6 100644
> --- a/include/linux/mmc/card.h
> +++ b/include/linux/mmc/card.h
> @@ -277,6 +277,7 @@ struct mmc_card {
>         unsigned int            erase_shift;    /* if erase unit is power 2 */
>         unsigned int            pref_erase;     /* in sectors */
>         unsigned int            eg_boundary;    /* don't cross erase-group boundaries */
> +       unsigned int            erase_arg;      /* erase / trim / discard */
>         u8                      erased_byte;    /* value of erased bytes */
>
>         u32                     raw_cid[4];     /* raw card CID */
> diff --git a/include/linux/mmc/sd.h b/include/linux/mmc/sd.h
> index 1ebcf9b..1a6d10f 100644
> --- a/include/linux/mmc/sd.h
> +++ b/include/linux/mmc/sd.h
> @@ -91,4 +91,9 @@
>  #define SD_SWITCH_ACCESS_DEF   0
>  #define SD_SWITCH_ACCESS_HS    1
>
> +/*
> + * Erase/discard
> + */
> +#define SD_ERASE_ARG                   0x00000000
> +
>  #endif /* LINUX_MMC_SD_H */
> --
> 1.9.1
>



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux