RE: [PATCH v3 02/10] mmc: sd: Add SD CSD version 3.0

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

 



> On Wed, 14 Aug 2024 at 09:31, Avri Altman <avri.altman@xxxxxxx> wrote:
> >
> > Ultra Capacity SD cards (SDUC) was already introduced in SD7.0.  Those
> > cards support capacity larger than 2TB and up to including 128TB.
> > Properly parse the csd register as the c_size field got expanded to 28
> > bits.
> >
> > Tested-by: Ricky WU <ricky_wu@xxxxxxxxxxx>
> > Signed-off-by: Avri Altman <avri.altman@xxxxxxx>
> 
> This is more what I expected from patch1. Perhaps we should simply squash
> patch1 and patch2?
Done.

Thanks,
Avri

> 
> Kind regards
> Uffe
> 
> > ---
> >  drivers/mmc/core/bus.c   |  4 +++-
> >  drivers/mmc/core/card.h  |  3 +++
> >  drivers/mmc/core/sd.c    | 16 +++++++++++-----
> >  include/linux/mmc/card.h |  2 +-
> >  4 files changed, 18 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index
> > 0ddaee0eae54..30763b342bd3 100644
> > --- a/drivers/mmc/core/bus.c
> > +++ b/drivers/mmc/core/bus.c
> > @@ -321,7 +321,9 @@ int mmc_add_card(struct mmc_card *card)
> >         case MMC_TYPE_SD:
> >                 type = "SD";
> >                 if (mmc_card_blockaddr(card)) {
> > -                       if (mmc_card_ext_capacity(card))
> > +                       if (mmc_card_ult_capacity(card))
> > +                               type = "SDUC";
> > +                       else if (mmc_card_ext_capacity(card))
> >                                 type = "SDXC";
> >                         else
> >                                 type = "SDHC"; diff --git
> > a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h index
> > b7754a1b8d97..64dcb463a4f4 100644
> > --- a/drivers/mmc/core/card.h
> > +++ b/drivers/mmc/core/card.h
> > @@ -23,6 +23,7 @@
> >  #define MMC_CARD_SDXC          (1<<3)          /* card is SDXC */
> >  #define MMC_CARD_REMOVED       (1<<4)          /* card has been removed */
> >  #define MMC_STATE_SUSPENDED    (1<<5)          /* card is suspended */
> > +#define MMC_CARD_SDUC          (1<<6)          /* card is SDUC */
> >
> >  #define mmc_card_present(c)    ((c)->state & MMC_STATE_PRESENT)
> >  #define mmc_card_readonly(c)   ((c)->state & MMC_STATE_READONLY)
> > @@ -30,11 +31,13 @@
> >  #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC)
> >  #define mmc_card_removed(c)    ((c) && ((c)->state &
> MMC_CARD_REMOVED))
> >  #define mmc_card_suspended(c)  ((c)->state & MMC_STATE_SUSPENDED)
> > +#define mmc_card_ult_capacity(c) ((c)->state & MMC_CARD_SDUC)
> >
> >  #define mmc_card_set_present(c)        ((c)->state |= MMC_STATE_PRESENT)
> >  #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
> > #define mmc_card_set_blockaddr(c) ((c)->state |=
> MMC_STATE_BLOCKADDR)
> > #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC)
> > +#define mmc_card_set_ult_capacity(c) ((c)->state |= MMC_CARD_SDUC)
> >  #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED)
> > #define mmc_card_set_suspended(c) ((c)->state |=
> MMC_STATE_SUSPENDED)
> > #define mmc_card_clr_suspended(c) ((c)->state &=
> ~MMC_STATE_SUSPENDED)
> > diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index
> > 1c8148cdda50..28193a9b31c9 100644
> > --- a/drivers/mmc/core/sd.c
> > +++ b/drivers/mmc/core/sd.c
> > @@ -157,6 +157,7 @@ static int mmc_decode_csd(struct mmc_card *card)
> >                         mmc_card_set_readonly(card);
> >                 break;
> >         case 1:
> > +       case 2:
> >                 /*
> >                  * This is a block-addressed SDHC or SDXC card. Most
> >                  * interesting fields are unused and have fixed @@
> > -172,14 +173,19 @@ static int mmc_decode_csd(struct mmc_card *card)
> >                 e = UNSTUFF_BITS(resp, 96, 3);
> >                 csd->max_dtr      = tran_exp[e] * tran_mant[m];
> >                 csd->cmdclass     = UNSTUFF_BITS(resp, 84, 12);
> > -               csd->c_size       = UNSTUFF_BITS(resp, 48, 22);
> >
> > -               /* SDXC cards have a minimum C_SIZE of 0x00FFFF */
> > -               if (csd->c_size >= 0xFFFF)
> > +               if (csd_struct == 1)
> > +                       m = UNSTUFF_BITS(resp, 48, 22);
> > +               else
> > +                       m = UNSTUFF_BITS(resp, 48, 28);
> > +               csd->c_size = m;
> > +
> > +               if (csd->c_size >= 0x400000 && mmc_card_is_sduc(card->host))
> > +                       mmc_card_set_ult_capacity(card);
> > +               else if (csd->c_size >= 0xFFFF)
> >                         mmc_card_set_ext_capacity(card);
> >
> > -               m = UNSTUFF_BITS(resp, 48, 22);
> > -               csd->capacity     = (1 + m) << 10;
> > +               csd->capacity     = (1 + (typeof(sector_t))m) << 10;
> >
> >                 csd->read_blkbits = 9;
> >                 csd->read_partial = 0; diff --git
> > a/include/linux/mmc/card.h b/include/linux/mmc/card.h index
> > f34407cc2788..f39bce322365 100644
> > --- a/include/linux/mmc/card.h
> > +++ b/include/linux/mmc/card.h
> > @@ -35,7 +35,7 @@ struct mmc_csd {
> >         unsigned int            wp_grp_size;
> >         unsigned int            read_blkbits;
> >         unsigned int            write_blkbits;
> > -       unsigned int            capacity;
> > +       sector_t                capacity;
> >         unsigned int            read_partial:1,
> >                                 read_misalign:1,
> >                                 write_partial:1,
> > --
> > 2.25.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