#include <scsi/scsi_driver.h>
 #include <scsi/scsi_eh.h>
 #include <scsi/scsi_host.h>
-#include <scsi/scsi_transport.h> /* __scsi_init_queue() */
+#include <scsi/scsi_transport.h> /* scsi_init_limits() */
 #include <scsi/scsi_dh.h>
 
 #include <trace/events/scsi.h>
        blk_mq_map_queues(&set->map[HCTX_TYPE_DEFAULT]);
 }
 
-void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)
+void scsi_init_limits(struct Scsi_Host *shost, struct queue_limits *lim)
 {
        struct device *dev = shost->dma_dev;
 
-       /*
-        * this limit is imposed by hardware restrictions
-        */
-       blk_queue_max_segments(q, min_t(unsigned short, shost->sg_tablesize,
-                                       SG_MAX_SEGMENTS));
+       memset(lim, 0, sizeof(*lim));
+       lim->max_segments =
+               min_t(unsigned short, shost->sg_tablesize, SG_MAX_SEGMENTS);
 
        if (scsi_host_prot_dma(shost)) {
                shost->sg_prot_tablesize =
                        min_not_zero(shost->sg_prot_tablesize,
                                     (unsigned short)SCSI_MAX_PROT_SG_SEGMENTS);
                BUG_ON(shost->sg_prot_tablesize < shost->sg_tablesize);
-               blk_queue_max_integrity_segments(q, shost->sg_prot_tablesize);
+               lim->max_integrity_segments = shost->sg_prot_tablesize;
        }
 
-       blk_queue_max_hw_sectors(q, shost->max_sectors);
-       blk_queue_segment_boundary(q, shost->dma_boundary);
-       dma_set_seg_boundary(dev, shost->dma_boundary);
-
-       blk_queue_max_segment_size(q, shost->max_segment_size);
-       blk_queue_virt_boundary(q, shost->virt_boundary_mask);
-       dma_set_max_seg_size(dev, queue_max_segment_size(q));
+       lim->max_hw_sectors = shost->max_sectors;
+       lim->seg_boundary_mask = shost->dma_boundary;
+       lim->max_segment_size = shost->max_segment_size;
+       lim->virt_boundary_mask = shost->virt_boundary_mask;
 
        /*
         * Set a reasonable default alignment:  The larger of 32-byte (dword),
         *
         * Devices that require a bigger alignment can increase it later.
         */
-       blk_queue_dma_alignment(q, max(4, dma_get_cache_alignment()) - 1);
+       lim->dma_alignment = max(4, dma_get_cache_alignment()) - 1;
+
+       dma_set_seg_boundary(dev, shost->dma_boundary);
+       dma_set_max_seg_size(dev, shost->max_segment_size);
 }
-EXPORT_SYMBOL_GPL(__scsi_init_queue);
+EXPORT_SYMBOL_GPL(scsi_init_limits);
 
 static const struct blk_mq_ops scsi_mq_ops_no_commit = {
        .get_budget     = scsi_mq_get_budget,
 
        struct request_queue *q;
        int display_failure_msg = 1, ret;
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+       struct queue_limits lim;
 
        sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size,
                       GFP_KERNEL);
 
        sdev->sg_reserved_size = INT_MAX;
 
-       q = blk_mq_alloc_queue(&sdev->host->tag_set, NULL, NULL);
+       scsi_init_limits(shost, &lim);
+       q = blk_mq_alloc_queue(&sdev->host->tag_set, &lim, NULL);
        if (IS_ERR(q)) {
                /* release fn is set up in scsi_sysfs_device_initialise, so
                 * have to free and put manually here */
        kref_get(&sdev->host->tagset_refcnt);
        sdev->request_queue = q;
        q->queuedata = sdev;
-       __scsi_init_queue(sdev->host, q);
 
        depth = sdev->host->cmd_per_lun ?: 1;
 
 
 {
        struct device *dev = &shost->shost_gendev;
        struct fc_internal *i = to_fc_internal(shost->transportt);
+       struct queue_limits lim;
        struct request_queue *q;
        char bsg_name[20];
 
 
        snprintf(bsg_name, sizeof(bsg_name),
                 "fc_host%d", shost->host_no);
-
-       q = bsg_setup_queue(dev, bsg_name, NULL, fc_bsg_dispatch,
+       scsi_init_limits(shost, &lim);
+       q = bsg_setup_queue(dev, bsg_name, &lim, fc_bsg_dispatch,
                        fc_bsg_job_timeout, i->f->dd_bsg_size);
        if (IS_ERR(q)) {
                dev_err(dev,
                        shost->host_no);
                return PTR_ERR(q);
        }
-       __scsi_init_queue(shost, q);
        blk_queue_rq_timeout(q, FC_DEFAULT_BSG_TIMEOUT);
        fc_host->rqst_q = q;
        return 0;
 {
        struct device *dev = &rport->dev;
        struct fc_internal *i = to_fc_internal(shost->transportt);
+       struct queue_limits lim;
        struct request_queue *q;
 
        rport->rqst_q = NULL;
        if (!i->f->bsg_request)
                return -ENOTSUPP;
 
-       q = bsg_setup_queue(dev, dev_name(dev), NULL, fc_bsg_dispatch_prep,
+       scsi_init_limits(shost, &lim);
+       q = bsg_setup_queue(dev, dev_name(dev), &lim, fc_bsg_dispatch_prep,
                                fc_bsg_job_timeout, i->f->dd_bsg_size);
        if (IS_ERR(q)) {
                dev_err(dev, "failed to setup bsg queue\n");
                return PTR_ERR(q);
        }
-       __scsi_init_queue(shost, q);
        blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
        rport->rqst_q = q;
        return 0;
 
 {
        struct device *dev = &shost->shost_gendev;
        struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
+       struct queue_limits lim;
        struct request_queue *q;
        char bsg_name[20];
 
                return -ENOTSUPP;
 
        snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
-       q = bsg_setup_queue(dev, bsg_name, NULL, iscsi_bsg_host_dispatch, NULL,
+       scsi_init_limits(shost, &lim);
+       q = bsg_setup_queue(dev, bsg_name, &lim, iscsi_bsg_host_dispatch, NULL,
                        0);
        if (IS_ERR(q)) {
                shost_printk(KERN_ERR, shost, "bsg interface failed to "
                             "initialize - no request queue\n");
                return PTR_ERR(q);
        }
-       __scsi_init_queue(shost, q);
 
        ihost->bsg_q = q;
        return 0;
 
                + shost->transportt->device_private_offset;
 }
 
-void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q);
+void scsi_init_limits(struct Scsi_Host *shost, struct queue_limits *lim);
 
 #endif /* SCSI_TRANSPORT_H */