scsi: ufs: remove the duplicated checking for supporting clkscaling
[platform/kernel/linux-rpi.git] / block / bsg-lib.c
index 9d652a9..cd15f9d 100644 (file)
@@ -71,22 +71,24 @@ void bsg_job_done(struct bsg_job *job, int result,
 {
        struct request *req = job->req;
        struct request *rsp = req->next_rq;
+       struct scsi_request *rq = scsi_req(req);
        int err;
 
        err = job->req->errors = result;
        if (err < 0)
                /* we're only returning the result field in the reply */
-               job->req->sense_len = sizeof(u32);
+               rq->sense_len = sizeof(u32);
        else
-               job->req->sense_len = job->reply_len;
+               rq->sense_len = job->reply_len;
        /* we assume all request payload was transferred, residual == 0 */
-       req->resid_len = 0;
+       rq->resid_len = 0;
 
        if (rsp) {
-               WARN_ON(reply_payload_rcv_len > rsp->resid_len);
+               WARN_ON(reply_payload_rcv_len > scsi_req(rsp)->resid_len);
 
                /* set reply (bidi) residual */
-               rsp->resid_len -= min(reply_payload_rcv_len, rsp->resid_len);
+               scsi_req(rsp)->resid_len -=
+                       min(reply_payload_rcv_len, scsi_req(rsp)->resid_len);
        }
        blk_complete_request(req);
 }
@@ -113,6 +115,7 @@ static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req)
        if (!buf->sg_list)
                return -ENOMEM;
        sg_init_table(buf->sg_list, req->nr_phys_segments);
+       scsi_req(req)->resid_len = blk_rq_bytes(req);
        buf->sg_cnt = blk_rq_map_sg(req->q, req, buf->sg_list);
        buf->payload_len = blk_rq_bytes(req);
        return 0;
@@ -127,6 +130,7 @@ static int bsg_create_job(struct device *dev, struct request *req)
 {
        struct request *rsp = req->next_rq;
        struct request_queue *q = req->q;
+       struct scsi_request *rq = scsi_req(req);
        struct bsg_job *job;
        int ret;
 
@@ -140,9 +144,9 @@ static int bsg_create_job(struct device *dev, struct request *req)
        job->req = req;
        if (q->bsg_job_size)
                job->dd_data = (void *)&job[1];
-       job->request = req->cmd;
-       job->request_len = req->cmd_len;
-       job->reply = req->sense;
+       job->request = rq->cmd;
+       job->request_len = rq->cmd_len;
+       job->reply = rq->sense;
        job->reply_len = SCSI_SENSE_BUFFERSIZE; /* Size of sense buffer
                                                 * allocated */
        if (req->bio) {
@@ -177,7 +181,7 @@ failjob_rls_job:
  *
  * Drivers/subsys should pass this to the queue init function.
  */
-void bsg_request_fn(struct request_queue *q)
+static void bsg_request_fn(struct request_queue *q)
        __releases(q->queue_lock)
        __acquires(q->queue_lock)
 {
@@ -214,24 +218,30 @@ void bsg_request_fn(struct request_queue *q)
        put_device(dev);
        spin_lock_irq(q->queue_lock);
 }
-EXPORT_SYMBOL_GPL(bsg_request_fn);
 
 /**
  * bsg_setup_queue - Create and add the bsg hooks so we can receive requests
  * @dev: device to attach bsg device to
- * @q: request queue setup by caller
  * @name: device to give bsg device
  * @job_fn: bsg job handler
  * @dd_job_size: size of LLD data needed for each job
- *
- * The caller should have setup the reuqest queue with bsg_request_fn
- * as the request_fn.
  */
-int bsg_setup_queue(struct device *dev, struct request_queue *q,
-                   char *name, bsg_job_fn *job_fn, int dd_job_size)
+struct request_queue *bsg_setup_queue(struct device *dev, char *name,
+               bsg_job_fn *job_fn, int dd_job_size)
 {
+       struct request_queue *q;
        int ret;
 
+       q = blk_alloc_queue(GFP_KERNEL);
+       if (!q)
+               return ERR_PTR(-ENOMEM);
+       q->cmd_size = sizeof(struct scsi_request);
+       q->request_fn = bsg_request_fn;
+
+       ret = blk_init_allocated_queue(q);
+       if (ret)
+               goto out_cleanup_queue;
+
        q->queuedata = dev;
        q->bsg_job_size = dd_job_size;
        q->bsg_job_fn = job_fn;
@@ -243,9 +253,12 @@ int bsg_setup_queue(struct device *dev, struct request_queue *q,
        if (ret) {
                printk(KERN_ERR "%s: bsg interface failed to "
                       "initialize - register queue\n", dev->kobj.name);
-               return ret;
+               goto out_cleanup_queue;
        }
 
-       return 0;
+       return q;
+out_cleanup_queue:
+       blk_cleanup_queue(q);
+       return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(bsg_setup_queue);