Move the mmc block request to the mmc queue struct in
order to make way for processing two brqs simultanously.

Signed-off-by: Per Forlin <per.for...@linaro.org>
---
 drivers/mmc/card/block.c |   68 +++++++++++++++++++++-------------------------
 drivers/mmc/card/queue.h |    9 +++++-
 2 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 3f98b15..028b2b8 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -165,13 +165,6 @@ static const struct block_device_operations mmc_bdops = {
        .owner                  = THIS_MODULE,
 };
 
-struct mmc_blk_request {
-       struct mmc_request      mrq;
-       struct mmc_command      cmd;
-       struct mmc_command      stop;
-       struct mmc_data         data;
-};
-
 static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
 {
        int err;
@@ -422,11 +415,11 @@ static void mmc_blk_issue_rw_rq_prep(struct 
mmc_blk_request *brq,
        mmc_queue_bounce_pre(mqrq);
 }
 
-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;
+       struct mmc_blk_request *brqc = &mq->mqrq_cur->brq;
        int ret = 1, disable_multi = 0;
 
        mmc_claim_host(card->host);
@@ -435,9 +428,9 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct 
request *req)
                struct mmc_command cmd;
                u32 status = 0;
 
-               mmc_blk_issue_rw_rq_prep(&brq, mq->mqrq_cur, req, card,
+               mmc_blk_issue_rw_rq_prep(brqc, mq->mqrq_cur, rqc, card,
                                         disable_multi, mq);
-               mmc_wait_for_req(card->host, &brq.mrq);
+               mmc_wait_for_req(card->host, &brqc->mrq);
 
                mmc_queue_bounce_post(mq->mqrq_cur);
 
@@ -446,43 +439,43 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, 
struct request *req)
                 * until later as we need to wait for the card to leave
                 * programming mode even when things go wrong.
                 */
-               if (brq.cmd.error || brq.data.error || brq.stop.error) {
-                       if (brq.data.blocks > 1 && rq_data_dir(req) == READ) {
+               if (brqc->cmd.error || brqc->data.error || brqc->stop.error) {
+                       if (brqc->data.blocks > 1 && rq_data_dir(rqc) == READ) {
                                /* Redo read one sector at a time */
                                printk(KERN_WARNING "%s: retrying using single "
-                                      "block read\n", req->rq_disk->disk_name);
+                                      "block read\n", rqc->rq_disk->disk_name);
                                disable_multi = 1;
                                continue;
                        }
-                       status = get_card_status(card, req);
+                       status = get_card_status(card, rqc);
                }
 
-               if (brq.cmd.error) {
+               if (brqc->cmd.error) {
                        printk(KERN_ERR "%s: error %d sending read/write "
                               "command, response %#x, card status %#x\n",
-                              req->rq_disk->disk_name, brq.cmd.error,
-                              brq.cmd.resp[0], status);
+                              rqc->rq_disk->disk_name, brqc->cmd.error,
+                              brqc->cmd.resp[0], status);
                }
 
-               if (brq.data.error) {
-                       if (brq.data.error == -ETIMEDOUT && brq.mrq.stop)
+               if (brqc->data.error) {
+                       if (brqc->data.error == -ETIMEDOUT && brqc->mrq.stop)
                                /* 'Stop' response contains card status */
-                               status = brq.mrq.stop->resp[0];
+                               status = brqc->mrq.stop->resp[0];
                        printk(KERN_ERR "%s: error %d transferring data,"
                               " sector %u, nr %u, card status %#x\n",
-                              req->rq_disk->disk_name, brq.data.error,
-                              (unsigned)blk_rq_pos(req),
-                              (unsigned)blk_rq_sectors(req), status);
+                              rqc->rq_disk->disk_name, brqc->data.error,
+                              (unsigned)blk_rq_pos(rqc),
+                              (unsigned)blk_rq_sectors(rqc), status);
                }
 
-               if (brq.stop.error) {
+               if (brqc->stop.error) {
                        printk(KERN_ERR "%s: error %d sending stop command, "
                               "response %#x, card status %#x\n",
-                              req->rq_disk->disk_name, brq.stop.error,
-                              brq.stop.resp[0], status);
+                              rqc->rq_disk->disk_name, brqc->stop.error,
+                              brqc->stop.resp[0], status);
                }
 
-               if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
+               if (!mmc_host_is_spi(card->host) && rq_data_dir(rqc) != READ) {
                        do {
                                int err;
 
@@ -492,7 +485,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct 
request *req)
                                err = mmc_wait_for_cmd(card->host, &cmd, 5);
                                if (err) {
                                        printk(KERN_ERR "%s: error %d 
requesting status\n",
-                                              req->rq_disk->disk_name, err);
+                                              rqc->rq_disk->disk_name, err);
                                        goto cmd_err;
                                }
                                /*
@@ -506,21 +499,22 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, 
struct request *req)
 #if 0
                        if (cmd.resp[0] & ~0x00000900)
                                printk(KERN_ERR "%s: status = %08x\n",
-                                      req->rq_disk->disk_name, cmd.resp[0]);
+                                      rqc->rq_disk->disk_name, cmd.resp[0]);
                        if (mmc_decode_status(cmd.resp))
                                goto cmd_err;
 #endif
                }
 
-               if (brq.cmd.error || brq.stop.error || brq.data.error) {
-                       if (rq_data_dir(req) == READ) {
+               if (brqc->cmd.error || brqc->stop.error || brqc->data.error) {
+                       if (rq_data_dir(rqc) == READ) {
                                /*
                                 * After an error, we redo I/O one sector at a
                                 * time, so we only reach here after trying to
                                 * read a single sector.
                                 */
                                spin_lock_irq(&md->lock);
-                               ret = __blk_end_request(req, -EIO, 
brq.data.blksz);
+                               ret = __blk_end_request(rqc, -EIO,
+                                                       brqc->data.blksz);
                                spin_unlock_irq(&md->lock);
                                continue;
                        }
@@ -531,7 +525,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct 
request *req)
                 * A block was successfully transferred.
                 */
                spin_lock_irq(&md->lock);
-               ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
+               ret = __blk_end_request(rqc, 0, brqc->data.bytes_xfered);
                spin_unlock_irq(&md->lock);
        } while (ret);
 
@@ -554,12 +548,12 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, 
struct request *req)
                blocks = mmc_sd_num_wr_blocks(card);
                if (blocks != (u32)-1) {
                        spin_lock_irq(&md->lock);
-                       ret = __blk_end_request(req, 0, blocks << 9);
+                       ret = __blk_end_request(rqc, 0, blocks << 9);
                        spin_unlock_irq(&md->lock);
                }
        } else {
                spin_lock_irq(&md->lock);
-               ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
+               ret = __blk_end_request(rqc, 0, brqc->data.bytes_xfered);
                spin_unlock_irq(&md->lock);
        }
 
@@ -567,7 +561,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct 
request *req)
 
        spin_lock_irq(&md->lock);
        while (ret)
-               ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req));
+               ret = __blk_end_request(rqc, -EIO, blk_rq_cur_bytes(rqc));
        spin_unlock_irq(&md->lock);
 
        return 0;
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
index f65eb88..bf3dee9 100644
--- a/drivers/mmc/card/queue.h
+++ b/drivers/mmc/card/queue.h
@@ -4,12 +4,20 @@
 struct request;
 struct task_struct;
 
+struct mmc_blk_request {
+       struct mmc_request      mrq;
+       struct mmc_command      cmd;
+       struct mmc_command      stop;
+       struct mmc_data         data;
+};
+
 struct mmc_queue_req {
        struct request          *req;
        struct scatterlist      *sg;
        char                    *bounce_buf;
        struct scatterlist      *bounce_sg;
        unsigned int            bounce_sg_len;
+       struct mmc_blk_request  brq;
 };
 
 struct mmc_queue {
@@ -20,7 +28,6 @@ struct mmc_queue {
        int                     (*issue_fn)(struct mmc_queue *, struct request 
*);
        void                    *data;
        struct request_queue    *queue;
-
        struct mmc_queue_req    mqrq[2];
        struct mmc_queue_req    *mqrq_cur;
        struct mmc_queue_req    *mqrq_prev;
-- 
1.7.1

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

Reply via email to