Re: [PATCH V9 06/23] mmc: core: Support UHS-II card control and access

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

 



On Thu, Aug 10, 2023 at 6:07 PM Ulf Hansson <ulf.hansson@xxxxxxxxxx> wrote:
>
> On Wed, 9 Aug 2023 at 17:09, Victor Shih <victorshihgli@xxxxxxxxx> wrote:
> >
> > On Tue, Aug 8, 2023 at 9:48 PM Ulf Hansson <ulf.hansson@xxxxxxxxxx> wrote:
> > >
> > > On Fri, 21 Jul 2023 at 12:14, Victor Shih <victorshihgli@xxxxxxxxx> wrote:
> > > >
> > > > From: Victor Shih <victor.shih@xxxxxxxxxxxxxxxxxxx>
> > > >
> > > > Embed UHS-II access/control functionality into the MMC request
> > > > processing flow.
> > >
> > > This deserves to be extended a bit. There is quite some code being
> > > added in the $subject patch.
> > >
> > > >
> > > > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
> > > > Signed-off-by: Jason Lai <jason.lai@xxxxxxxxxxxxxxxxxxx>
> > > > Signed-off-by: Victor Shih <victor.shih@xxxxxxxxxxxxxxxxxxx>
> > > > ---
> > > >
> > > > Updates in V8:
> > > >  - Add MMC_UHS2_SUPPORT to be cleared in sd_uhs2_detect().
> > > >  - Modify return value in sd_uhs2_attach().
> > > >
> > > > Updates in V7:
> > > >  - Add mmc_uhs2_card_prepare_cmd helper function in sd_ops.h.
> > > >  - Drop uhs2_state in favor of ios->timing.
> > > >  - Remove unnecessary functions.
> > > >
> > > > ---
> > > >
> > > >  drivers/mmc/core/block.c   |   18 +-
> > > >  drivers/mmc/core/core.c    |    8 +
> > > >  drivers/mmc/core/mmc_ops.c |   25 +-
> > > >  drivers/mmc/core/mmc_ops.h |    1 +
> > > >  drivers/mmc/core/sd.c      |   13 +-
> > > >  drivers/mmc/core/sd.h      |    4 +
> > > >  drivers/mmc/core/sd_ops.c  |   11 +
> > > >  drivers/mmc/core/sd_ops.h  |   18 +
> > > >  drivers/mmc/core/sd_uhs2.c | 1137 +++++++++++++++++++++++++++++++++++-
> > > >  9 files changed, 1176 insertions(+), 59 deletions(-)
> > > >
> > > > diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> > > > index f701efb1fa78..6617ae9fc840 100644
> > > > --- a/drivers/mmc/core/block.c
> > > > +++ b/drivers/mmc/core/block.c
> > > > @@ -918,15 +918,9 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)
> > > >
> > > >         struct scatterlist sg;
> > > >
> > > > -       cmd.opcode = MMC_APP_CMD;
> > > > -       cmd.arg = card->rca << 16;
> > > > -       cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
> > > > -
> > > > -       err = mmc_wait_for_cmd(card->host, &cmd, 0);
> > > > -       if (err)
> > > > -               return err;
> > > > -       if (!mmc_host_is_spi(card->host) && !(cmd.resp[0] & R1_APP_CMD))
> > > > -               return -EIO;
> > > > +       err = mmc_app_cmd(card->host, card);
> > > > +               if (err)
> > > > +                       return err;
> > > >
> > > >         memset(&cmd, 0, sizeof(struct mmc_command));
> > >
> > > The entire chunk of change above deserves its own separate
> > > cleanup-patch. If you want to send it separately I can apply
> > > immediately - or if you decide to make it part of the series then it
> > > should precede the $subject patch.
> > >
> > > Note that, after the cleanup above, the call to memset() can be dropped too.
> > >
> >
> > Hi, Ulf
> >
> >      Which patch do you think would be the best if I decided to make
> > it part of the series?
>
> Probably easier to send it separate, before a new respin of the
> series. I can apply it immediately and you rebase your series on top.
>
> If there is anything similar part of the series that also can be
> considered as a cleanup, feel free to send that separate too, to get
> that applied first.
>
> Kind regards
> Uffe
>
> >
> > Thanks, Victor Shih
> >
> > > >
> > > > @@ -1612,6 +1606,9 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
> > >
> > > I commented on the changes in mmc_blk_rw_rq_prep() already in version
> > > 6 [1] - but it seems like you haven't addressed my comments yet.
> > >
> > > I have therefore copied the similar comment again, see below.
> > >
> > > >         struct request *req = mmc_queue_req_to_req(mqrq);
> > > >         struct mmc_blk_data *md = mq->blkdata;
> > > >         bool do_rel_wr, do_data_tag;
> > > > +       bool do_multi;
> > > > +
> > > > +       do_multi = (card->host->flags & MMC_UHS2_SD_TRAN) ? true : false;
> > > >
> > > >         mmc_blk_data_prep(mq, mqrq, recovery_mode, &do_rel_wr, &do_data_tag);
> > > >
> > > > @@ -1622,7 +1619,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
> > > >                 brq->cmd.arg <<= 9;
> > > >         brq->cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
> > > >
> > > > -       if (brq->data.blocks > 1 || do_rel_wr) {
> > > > +       if (brq->data.blocks > 1 || do_rel_wr || do_multi) {
> > >
> > > This looks wrong to me. UHS2 can use single block read/writes too. Right?
> > >
> > > >                 /* SPI multiblock writes terminate using a special
> > > >                  * token, not a STOP_TRANSMISSION request.
> > > >                  */
> > > > @@ -1635,6 +1632,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
> > > >                 brq->mrq.stop = NULL;
> > > >                 readcmd = MMC_READ_SINGLE_BLOCK;
> > > >                 writecmd = MMC_WRITE_BLOCK;
> > > > +               brq->cmd.uhs2_tmode0_flag = 1;
> > > >         }
> > >
> > > As "do_multi" is always set for UHS2, setting this flag here seems to
> > > be wrong/redundant.
> > >
> > > Anyway, if I understand correctly, the flag is intended to be used to
> > > inform the host driver whether the so-called 2L_HD_mode (half-duplex
> > > or full-duplex) should be used for the I/O request or not. Did I
> > > understand this correctly?
> > >
> > > To fix the above behaviour, I suggest we try to move the entire
> > > control of the flag into mmc_uhs2_prepare_cmd(). It seems like we need
> > > the flag to be set for multi block read/writes (CMD18 and CMD25), but
> > > only if the host and card supports the 2L_HD_mode too, right?
> > >
> > > According to my earlier suggestions, we should also be able to check
> > > the 2L_HD_mode via the bits we have set in the ios->timing, no?
> > >
> > > Moreover, by making mmc_uhs2_prepare_cmd() responsible for setting the
> > > flag, we can move the definition of the flag into the struct
> > > uhs2_command instead. While at it, I suggest we also rename the flag
> > > into "tmode_half_duplex", to better describe its purpose. Note that,
> > > this also means the interpretation of the flag becomes inverted.
> > >

Hi, Ulf

     I will drop do_multi and use tmode_half_duplex to stead of
     the uhs2_tmode0_flag  in the V10 version.

Thanks, Victor Shih

> > > >         brq->cmd.opcode = rq_data_dir(req) == READ ? readcmd : writecmd;
> > > >
> > >
> > > Until we have agreed on how to move forward with the above, I am
> > > temporarily pausing further review.
> > >
> > > [...]
> > >
> > > Kind regards
> > > Uffe
> > >
> > > [1]
> > > https://lore.kernel.org/linux-mmc/CAPDyKFoV3Ch-xzXxiT2RnDeLvsO454Pwq1vQL_bdNLptM+amAg@xxxxxxxxxxxxxx/




[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