Re: [V2 PATCH 1/5] mmc: replace sbc to precmd and add postcmd

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

 



On 3 April 2015 at 13:25, Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> wrote:
> right now we use sbc to present CMD23. If we want sbc to present
> other cmds, then it is not suitable. So change the name to precmd
> which means a cmd that needs to be sent before a cmd. So it can sent
> any command without misunderstanding
>
> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx>
> ---
>  drivers/mmc/card/block.c      |   27 ++++++++++++++-------------
>  drivers/mmc/card/queue.h      |    3 ++-
>  drivers/mmc/core/core.c       |   22 +++++++++++-----------
>  drivers/mmc/host/dw_mmc.c     |    8 ++++----
>  drivers/mmc/host/mmci.c       |   14 +++++++-------
>  drivers/mmc/host/omap_hsmmc.c |   18 +++++++++---------
>  drivers/mmc/host/sdhci.c      |   20 +++++++++++---------
>  include/linux/mmc/core.h      |    3 ++-
>  8 files changed, 60 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index c69afb5..ed62d6b 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -966,8 +966,9 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
>         }
>
>         /* Check for set block count errors */
> -       if (brq->sbc.error)
> -               return mmc_blk_cmd_error(req, "SET_BLOCK_COUNT", brq->sbc.error,
> +       if (brq->precmd.error)
> +               return mmc_blk_cmd_error(req, "SET_BLOCK_COUNT",
> +                               brq->precmd.error,
>                                 prev_cmd_status_valid, status);
>
>         /* Check for r/w command errors */
> @@ -1195,7 +1196,7 @@ static int mmc_blk_err_check(struct mmc_card *card,
>         int ecc_err = 0, gen_err = 0;
>
>         /*
> -        * sbc.error indicates a problem with the set block count
> +        * precmd.error indicates a problem with the set block count

/s set block count /precede

>          * command.  No data will have been transferred.
>          *
>          * cmd.error indicates a problem with the r/w command.  No
> @@ -1204,7 +1205,7 @@ static int mmc_blk_err_check(struct mmc_card *card,
>          * stop.error indicates a problem with the stop command.  Data
>          * may have been transferred, or may still be transferring.
>          */
> -       if (brq->sbc.error || brq->cmd.error || brq->stop.error ||
> +       if (brq->precmd.error || brq->cmd.error || brq->stop.error ||
>             brq->data.error) {
>                 switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err, &gen_err)) {
>                 case ERR_RETRY:
> @@ -1454,7 +1455,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
>          * with Auto-CMD23 enhancements provided by some
>          * hosts, means that the complexity of dealing
>          * with this is best left to the host. If CMD23 is
> -        * supported by card and host, we'll fill sbc in and let
> +        * supported by card and host, we'll fill precmd in and let
>          * the host deal with handling it correctly. This means
>          * that for hosts that don't expose MMC_CAP_CMD23, no
>          * change of behavior will be observed.
> @@ -1466,12 +1467,12 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
>         if ((md->flags & MMC_BLK_CMD23) && mmc_op_multi(brq->cmd.opcode) &&
>             (do_rel_wr || !(card->quirks & MMC_QUIRK_BLK_NO_CMD23) ||
>              do_data_tag)) {
> -               brq->sbc.opcode = MMC_SET_BLOCK_COUNT;
> -               brq->sbc.arg = brq->data.blocks |
> +               brq->precmd.opcode = MMC_SET_BLOCK_COUNT;
> +               brq->precmd.arg = brq->data.blocks |
>                         (do_rel_wr ? (1 << 31) : 0) |
>                         (do_data_tag ? (1 << 29) : 0);
> -               brq->sbc.flags = MMC_RSP_R1 | MMC_CMD_AC;
> -               brq->mrq.sbc = &brq->sbc;
> +               brq->precmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
> +               brq->mrq.precmd = &brq->precmd;
>         }
>
>         mmc_set_data_timeout(&brq->data, card);
> @@ -1680,12 +1681,12 @@ static void mmc_blk_packed_hdr_wrq_prep(struct mmc_queue_req *mqrq,
>         memset(brq, 0, sizeof(struct mmc_blk_request));
>         brq->mrq.cmd = &brq->cmd;
>         brq->mrq.data = &brq->data;
> -       brq->mrq.sbc = &brq->sbc;
> +       brq->mrq.precmd = &brq->precmd;
>         brq->mrq.stop = &brq->stop;
>
> -       brq->sbc.opcode = MMC_SET_BLOCK_COUNT;
> -       brq->sbc.arg = MMC_CMD23_ARG_PACKED | (packed->blocks + hdr_blocks);
> -       brq->sbc.flags = MMC_RSP_R1 | MMC_CMD_AC;
> +       brq->precmd.opcode = MMC_SET_BLOCK_COUNT;
> +       brq->precmd.arg = MMC_CMD23_ARG_PACKED | (packed->blocks + hdr_blocks);
> +       brq->precmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
>
>         brq->cmd.opcode = MMC_WRITE_MULTIPLE_BLOCK;
>         brq->cmd.arg = blk_rq_pos(req);
> diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
> index 5752d50..b129ddc 100644
> --- a/drivers/mmc/card/queue.h
> +++ b/drivers/mmc/card/queue.h
> @@ -8,8 +8,9 @@ struct task_struct;
>
>  struct mmc_blk_request {
>         struct mmc_request      mrq;
> -       struct mmc_command      sbc;
> +       struct mmc_command      precmd;
>         struct mmc_command      cmd;
> +       struct mmc_command      postcmd;

Let's not add postcmd in this patch, that should be a separate patch.

>         struct mmc_command      stop;
>         struct mmc_data         data;
>  };
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index c296bc0..75c67d9 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -150,12 +150,12 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
>
>                 led_trigger_event(host->led, LED_OFF);
>
> -               if (mrq->sbc) {
> +               if (mrq->precmd) {
>                         pr_debug("%s: req done <CMD%u>: %d: %08x %08x %08x %08x\n",
> -                               mmc_hostname(host), mrq->sbc->opcode,
> -                               mrq->sbc->error,
> -                               mrq->sbc->resp[0], mrq->sbc->resp[1],
> -                               mrq->sbc->resp[2], mrq->sbc->resp[3]);
> +                               mmc_hostname(host), mrq->precmd->opcode,
> +                               mrq->precmd->error,
> +                               mrq->precmd->resp[0], mrq->precmd->resp[1],
> +                               mrq->precmd->resp[2], mrq->precmd->resp[3]);
>                 }
>
>                 pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n",
> @@ -195,10 +195,10 @@ static int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
>         if (mmc_card_removed(host->card))
>                 return -ENOMEDIUM;
>
> -       if (mrq->sbc) {
> +       if (mrq->precmd) {
>                 pr_debug("<%s: starting CMD%u arg %08x flags %08x>\n",
> -                        mmc_hostname(host), mrq->sbc->opcode,
> -                        mrq->sbc->arg, mrq->sbc->flags);
> +                        mmc_hostname(host), mrq->precmd->opcode,
> +                        mrq->precmd->arg, mrq->precmd->flags);
>         }
>
>         pr_debug("%s: starting CMD%u arg %08x flags %08x\n",
> @@ -224,9 +224,9 @@ static int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
>
>         mrq->cmd->error = 0;
>         mrq->cmd->mrq = mrq;
> -       if (mrq->sbc) {
> -               mrq->sbc->error = 0;
> -               mrq->sbc->mrq = mrq;
> +       if (mrq->precmd) {
> +               mrq->precmd->error = 0;
> +               mrq->precmd->mrq = mrq;
>         }
>         if (mrq->data) {
>                 BUG_ON(mrq->data->blksz > host->max_blk_size);
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 3883fe6..633b4bb 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -1042,7 +1042,7 @@ static void dw_mci_start_request(struct dw_mci *host,
>         struct mmc_request *mrq = slot->mrq;
>         struct mmc_command *cmd;
>
> -       cmd = mrq->sbc ? mrq->sbc : mrq->cmd;
> +       cmd = mrq->precmd ? mrq->precmd : mrq->cmd;
>         __dw_mci_start_request(host, slot, cmd);
>  }
>
> @@ -1551,7 +1551,7 @@ static void dw_mci_tasklet_func(unsigned long priv)
>                         host->cmd = NULL;
>                         set_bit(EVENT_CMD_COMPLETE, &host->completed_events);
>                         err = dw_mci_command_complete(host, cmd);
> -                       if (cmd == mrq->sbc && !err) {
> +                       if (cmd == mrq->precmd && !err) {
>                                 prev_state = state = STATE_SENDING_CMD;
>                                 __dw_mci_start_request(host, host->cur_slot,
>                                                        mrq->cmd);
> @@ -1636,8 +1636,8 @@ static void dw_mci_tasklet_func(unsigned long priv)
>                         err = dw_mci_data_complete(host, data);
>
>                         if (!err) {
> -                               if (!data->stop || mrq->sbc) {
> -                                       if (mrq->sbc && data->stop)
> +                               if (!data->stop || mrq->precmd) {
> +                                       if (mrq->precmd && data->stop)
>                                                 data->stop->error = 0;
>                                         dw_mci_request_end(host, mrq);
>                                         goto unlock;
> diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
> index fb26674..c4b210a 100644
> --- a/drivers/mmc/host/mmci.c
> +++ b/drivers/mmc/host/mmci.c
> @@ -968,7 +968,7 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,
>                         /* The error clause is handled above, success! */
>                         data->bytes_xfered = data->blksz * data->blocks;
>
> -               if (!data->stop || host->mrq->sbc) {
> +               if (!data->stop || host->mrq->precmd) {
>                         mmci_request_end(host, data->mrq);
>                 } else {
>                         mmci_start_command(host, data->stop, 0);
> @@ -981,12 +981,12 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
>              unsigned int status)
>  {
>         void __iomem *base = host->base;
> -       bool sbc, busy_resp;
> +       bool precmd, busy_resp;
>
>         if (!cmd)
>                 return;
>
> -       sbc = (cmd == host->mrq->sbc);
> +       precmd = (cmd == host->mrq->precmd);
>         busy_resp = host->variant->busy_detect && (cmd->flags & MMC_RSP_BUSY);
>
>         if (!((status|host->busy_status) & (MCI_CMDCRCFAIL|MCI_CMDTIMEOUT|
> @@ -1027,7 +1027,7 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
>                 cmd->resp[3] = readl(base + MMCIRESPONSE3);
>         }
>
> -       if ((!sbc && !cmd->data) || cmd->error) {
> +       if ((!precmd && !cmd->data) || cmd->error) {
>                 if (host->data) {
>                         /* Terminate the DMA transfer */
>                         if (dma_inprogress(host)) {
> @@ -1037,7 +1037,7 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
>                         mmci_stop_data(host);
>                 }
>                 mmci_request_end(host, host->mrq);
> -       } else if (sbc) {
> +       } else if (precmd) {
>                 mmci_start_command(host, host->mrq->cmd, 0);
>         } else if (!(cmd->data->flags & MMC_DATA_READ)) {
>                 mmci_start_data(host, cmd->data);
> @@ -1302,8 +1302,8 @@ static void mmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
>         if (mrq->data && mrq->data->flags & MMC_DATA_READ)
>                 mmci_start_data(host, mrq->data);
>
> -       if (mrq->sbc)
> -               mmci_start_command(host, mrq->sbc, 0);
> +       if (mrq->precmd)
> +               mmci_start_command(host, mrq->precmd, 0);
>         else
>                 mmci_start_command(host, mrq->cmd, 0);
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 9df2b68..f41b660 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -810,9 +810,9 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd,
>         cmdreg = (cmd->opcode << 24) | (resptype << 16) | (cmdtype << 22);
>
>         if ((host->flags & AUTO_CMD23) && mmc_op_multi(cmd->opcode) &&
> -           host->mrq->sbc) {
> +           host->mrq->precmd) {
>                 cmdreg |= ACEN_ACMD23;
> -               OMAP_HSMMC_WRITE(host->base, SDMASA, host->mrq->sbc->arg);
> +               OMAP_HSMMC_WRITE(host->base, SDMASA, host->mrq->precmd->arg);
>         }
>         if (data) {
>                 cmdreg |= DP_SELECT | MSBS | BCE;
> @@ -893,7 +893,7 @@ omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
>         else
>                 data->bytes_xfered = 0;
>
> -       if (data->stop && (data->error || !host->mrq->sbc))
> +       if (data->stop && (data->error || !host->mrq->precmd))
>                 omap_hsmmc_start_command(host, data->stop, NULL);
>         else
>                 omap_hsmmc_request_done(host, data->mrq);
> @@ -905,8 +905,8 @@ omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
>  static void
>  omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
>  {
> -       if (host->mrq->sbc && (host->cmd == host->mrq->sbc) &&
> -           !host->mrq->sbc->error && !(host->flags & AUTO_CMD23)) {
> +       if (host->mrq->precmd && (host->cmd == host->mrq->precmd) &&
> +           !host->mrq->precmd->error && !(host->flags & AUTO_CMD23)) {
>                 host->cmd = NULL;
>                 omap_hsmmc_start_dma_transfer(host);
>                 omap_hsmmc_start_command(host, host->mrq->cmd,
> @@ -1070,13 +1070,13 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
>                 if (status & ACE_EN) {
>                         u32 ac12;
>                         ac12 = OMAP_HSMMC_READ(host->base, AC12);
> -                       if (!(ac12 & ACNE) && host->mrq->sbc) {
> +                       if (!(ac12 & ACNE) && host->mrq->precmd) {
>                                 end_cmd = 1;
>                                 if (ac12 & ACTO)
>                                         error =  -ETIMEDOUT;
>                                 else if (ac12 & (ACCE | ACEB | ACIE))
>                                         error = -EILSEQ;
> -                               host->mrq->sbc->error = error;
> +                               host->mrq->precmd->error = error;
>                                 hsmmc_command_incomplete(host, error, end_cmd);
>                         }
>                         dev_dbg(mmc_dev(host->mmc), "AC12 err: 0x%x\n", ac12);
> @@ -1547,8 +1547,8 @@ static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
>                 pm_runtime_put_autosuspend(host->dev);
>                 return;
>         }
> -       if (req->sbc && !(host->flags & AUTO_CMD23)) {
> -               omap_hsmmc_start_command(host, req->sbc, NULL);
> +       if (req->precmd && !(host->flags & AUTO_CMD23)) {
> +               omap_hsmmc_start_command(host, req->precmd, NULL);
>                 return;
>         }
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index c80287a..aad89d2 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -933,12 +933,14 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
>                  * If we are sending CMD23, CMD12 never gets sent
>                  * on successful completion (so no Auto-CMD12).
>                  */
> -               if (!host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD12) &&
> +               if (!host->mrq->precmd && (host->flags & SDHCI_AUTO_CMD12) &&
>                     (cmd->opcode != SD_IO_RW_EXTENDED))
>                         mode |= SDHCI_TRNS_AUTO_CMD12;
> -               else if (host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23)) {
> +               else if (host->mrq->precmd &&
> +                               (host->flags & SDHCI_AUTO_CMD23)) {
>                         mode |= SDHCI_TRNS_AUTO_CMD23;
> -                       sdhci_writel(host, host->mrq->sbc->arg, SDHCI_ARGUMENT2);
> +                       sdhci_writel(host, host->mrq->precmd->arg,
> +                                       SDHCI_ARGUMENT2);
>                 }
>         }
>
> @@ -990,7 +992,7 @@ static void sdhci_finish_data(struct sdhci_host *host)
>          */
>         if (data->stop &&
>             (data->error ||
> -            !host->mrq->sbc)) {
> +            !host->mrq->precmd)) {
>
>                 /*
>                  * The controller needs a reset of internal state machines
> @@ -1111,7 +1113,7 @@ static void sdhci_finish_command(struct sdhci_host *host)
>         host->cmd->error = 0;
>
>         /* Finished CMD23, now send actual command. */
> -       if (host->cmd == host->mrq->sbc) {
> +       if (host->cmd == host->mrq->precmd) {
>                 host->cmd = NULL;
>                 sdhci_send_command(host, host->mrq->cmd);
>         } else {
> @@ -1374,7 +1376,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
>          * Ensure we don't send the STOP for non-SET_BLOCK_COUNTED
>          * requests if Auto-CMD12 is enabled.
>          */
> -       if (!mrq->sbc && (host->flags & SDHCI_AUTO_CMD12)) {
> +       if (!mrq->precmd && (host->flags & SDHCI_AUTO_CMD12)) {
>                 if (mrq->stop) {
>                         mrq->data->stop = NULL;
>                         mrq->stop = NULL;
> @@ -1420,8 +1422,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
>                         }
>                 }
>
> -               if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23))
> -                       sdhci_send_command(host, mrq->sbc);
> +               if (mrq->precmd && !(host->flags & SDHCI_AUTO_CMD23))
> +                       sdhci_send_command(host, mrq->precmd);
>                 else
>                         sdhci_send_command(host, mrq->cmd);
>         }
> @@ -2275,7 +2277,7 @@ static void sdhci_tasklet_finish(unsigned long param)
>          */
>         if (!(host->flags & SDHCI_DEVICE_DEAD) &&
>             ((mrq->cmd && mrq->cmd->error) ||
> -            (mrq->sbc && mrq->sbc->error) ||
> +            (mrq->precmd && mrq->precmd->error) ||
>              (mrq->data && ((mrq->data->error && !mrq->data->stop) ||
>                             (mrq->data->stop && mrq->data->stop->error))) ||
>              (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {
> diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
> index 160448f..8445ecb 100644
> --- a/include/linux/mmc/core.h
> +++ b/include/linux/mmc/core.h
> @@ -127,8 +127,9 @@ struct mmc_data {
>
>  struct mmc_host;
>  struct mmc_request {
> -       struct mmc_command      *sbc;           /* SET_BLOCK_COUNT for multiblock */
> +       struct mmc_command      *precmd;
>         struct mmc_command      *cmd;
> +       struct mmc_command      *postcmd;

Remove postcmd from this patch please.

>         struct mmc_data         *data;
>         struct mmc_command      *stop;
>
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




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

  Powered by Linux