[PATCH v6 11/11] mmc: add handling for two parallel block requests in issue_rw_rq
Kishore Kadiyala
kishorek.kadiyala at gmail.com
Tue Jun 21 09:52:11 EDT 2011
Hi Per,
<snip>
>>>> --- a/drivers/mmc/card/block.c
>>>> +++ b/drivers/mmc/card/block.c
>>>> @@ -108,6 +108,7 @@ static DEFINE_MUTEX(open_lock);
>>>>
>>>> enum mmc_blk_status {
>>>> MMC_BLK_SUCCESS = 0,
>>>> + MMC_BLK_PARTIAL,
>>>> MMC_BLK_RETRY,
>>>> MMC_BLK_DATA_ERR,
>>>> MMC_BLK_CMD_ERR,
<snip>
>>>> -static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
>>>> +static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
>>>> {
>>>> struct mmc_blk_data *md = mq->data;
>>>> struct mmc_card *card = md->queue.card;
>>>> - struct mmc_blk_request *brq = &mq->mqrq_cur->brq;
>>>> - int ret = 1, disable_multi = 0;
>>>> + struct mmc_blk_request *brq;
>>>> + int ret = 1;
>>>> + int disable_multi = 0;
>>>> enum mmc_blk_status status;
Can initialize here
enum mmc_blk_status = MMC_BLK_SUCCESS
>>>> + struct mmc_queue_req *mq_rq;
>>>> + struct request *req;
>>>> + struct mmc_async_req *areq;
>>>> +
>>>> + if (!rqc && !mq->mqrq_prev->req)
>>>> + goto out;
>>>>
<snip>
I meant doing initialization in block.c itself and not core.c as above.
> The intention is to make this function available for SDIO as well.
Totally agree, having the API access to SDIO
> "int err = 0;" is set at the top of mmc_start_req(). Default err condition is 0.
>
> What do you think about the following changes?
>
> * @areq: async request to start
> - * @error: non zero in case of error
> + * @error: out parameter returns 0 for success, otherwise non zero
> *
> * Start a new MMC custom command request for a host.
> * If there is on ongoing async request wait for completion
> @@ -334,9 +334,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host,
> mmc_post_req(host, areq->mrq, -EINVAL);
>
> host->areq = NULL;
> - if (error)
> - *error = err;
> - return data;
> + goto out;
> }
> }
>
> @@ -347,6 +345,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host,
> mmc_post_req(host, host->areq->mrq, 0);
>
> host->areq = areq;
> + out:
> if (error)
> *error = err;
> return data;
>
The above change reduced the code size but still since 'error' is
pointer to the 'status' which is uninitialized,
so if(error) will be always true.
If you want to update *error in success/failure case [based on 'err'
]then can remove the if(error) check
else to update the error case only can look at the way proposed in my
previous mail.
Regards,
Kishore
More information about the linux-arm-kernel
mailing list