]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/scsi/qla2xxx/qla_bsg.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / qla2xxx / qla_bsg.c
index 643014f82f7d82d0a314581e4a9ef10d6a56eea6..1bf8061ff8032fae46854f84d85946ea55c6072a 100644 (file)
@@ -1,4 +1,4 @@
-/*
+       /*
  * QLogic Fibre Channel HBA Driver
  * Copyright (c)  2003-2014 QLogic Corporation
  *
@@ -9,6 +9,7 @@
 #include <linux/kthread.h>
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
+#include <linux/bsg-lib.h>
 
 /* BSG support for ELS/CT pass through */
 void
@@ -16,10 +17,12 @@ qla2x00_bsg_job_done(void *data, void *ptr, int res)
 {
        srb_t *sp = (srb_t *)ptr;
        struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
-       struct fc_bsg_job *bsg_job = sp->u.bsg_job;
+       struct bsg_job *bsg_job = sp->u.bsg_job;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
 
-       bsg_job->reply->result = res;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = res;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        sp->free(vha, sp);
 }
 
@@ -28,13 +31,15 @@ qla2x00_bsg_sp_free(void *data, void *ptr)
 {
        srb_t *sp = (srb_t *)ptr;
        struct scsi_qla_host *vha = sp->fcport->vha;
-       struct fc_bsg_job *bsg_job = sp->u.bsg_job;
+       struct bsg_job *bsg_job = sp->u.bsg_job;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+
        struct qla_hw_data *ha = vha->hw;
        struct qla_mt_iocb_rqst_fx00 *piocb_rqst;
 
        if (sp->type == SRB_FXIOCB_BCMD) {
                piocb_rqst = (struct qla_mt_iocb_rqst_fx00 *)
-                   &bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+                   &bsg_request->rqst_data.h_vendor.vendor_cmd[1];
 
                if (piocb_rqst->flags & SRB_FXDISC_REQ_DMA_VALID)
                        dma_unmap_sg(&ha->pdev->dev,
@@ -116,9 +121,11 @@ qla24xx_fcp_prio_cfg_valid(scsi_qla_host_t *vha,
 }
 
 static int
-qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
+qla24xx_proc_fcp_prio_cfg_cmd(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int ret = 0;
@@ -131,7 +138,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
        }
 
        /* Get the sub command */
-       oper = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+       oper = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
 
        /* Only set config is allowed if config memory is not allocated */
        if (!ha->fcp_prio_cfg && (oper != QLFC_FCP_PRIO_SET_CONFIG)) {
@@ -145,10 +152,10 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                        ha->fcp_prio_cfg->attributes &=
                                ~FCP_PRIO_ATTR_ENABLE;
                        qla24xx_update_all_fcp_prio(vha);
-                       bsg_job->reply->result = DID_OK;
+                       bsg_reply->result = DID_OK;
                } else {
                        ret = -EINVAL;
-                       bsg_job->reply->result = (DID_ERROR << 16);
+                       bsg_reply->result = (DID_ERROR << 16);
                        goto exit_fcp_prio_cfg;
                }
                break;
@@ -160,10 +167,10 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                                ha->fcp_prio_cfg->attributes |=
                                    FCP_PRIO_ATTR_ENABLE;
                                qla24xx_update_all_fcp_prio(vha);
-                               bsg_job->reply->result = DID_OK;
+                               bsg_reply->result = DID_OK;
                        } else {
                                ret = -EINVAL;
-                               bsg_job->reply->result = (DID_ERROR << 16);
+                               bsg_reply->result = (DID_ERROR << 16);
                                goto exit_fcp_prio_cfg;
                        }
                }
@@ -173,12 +180,12 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                len = bsg_job->reply_payload.payload_len;
                if (!len || len > FCP_PRIO_CFG_SIZE) {
                        ret = -EINVAL;
-                       bsg_job->reply->result = (DID_ERROR << 16);
+                       bsg_reply->result = (DID_ERROR << 16);
                        goto exit_fcp_prio_cfg;
                }
 
-               bsg_job->reply->result = DID_OK;
-               bsg_job->reply->reply_payload_rcv_len =
+               bsg_reply->result = DID_OK;
+               bsg_reply->reply_payload_rcv_len =
                        sg_copy_from_buffer(
                        bsg_job->reply_payload.sg_list,
                        bsg_job->reply_payload.sg_cnt, ha->fcp_prio_cfg,
@@ -189,7 +196,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
        case QLFC_FCP_PRIO_SET_CONFIG:
                len = bsg_job->request_payload.payload_len;
                if (!len || len > FCP_PRIO_CFG_SIZE) {
-                       bsg_job->reply->result = (DID_ERROR << 16);
+                       bsg_reply->result = (DID_ERROR << 16);
                        ret = -EINVAL;
                        goto exit_fcp_prio_cfg;
                }
@@ -200,7 +207,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                                ql_log(ql_log_warn, vha, 0x7050,
                                    "Unable to allocate memory for fcp prio "
                                    "config data (%x).\n", FCP_PRIO_CFG_SIZE);
-                               bsg_job->reply->result = (DID_ERROR << 16);
+                               bsg_reply->result = (DID_ERROR << 16);
                                ret = -ENOMEM;
                                goto exit_fcp_prio_cfg;
                        }
@@ -215,7 +222,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
 
                if (!qla24xx_fcp_prio_cfg_valid(vha,
                    (struct qla_fcp_prio_cfg *) ha->fcp_prio_cfg, 1)) {
-                       bsg_job->reply->result = (DID_ERROR << 16);
+                       bsg_reply->result = (DID_ERROR << 16);
                        ret = -EINVAL;
                        /* If buffer was invalidatic int
                         * fcp_prio_cfg is of no use
@@ -229,7 +236,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                if (ha->fcp_prio_cfg->attributes & FCP_PRIO_ATTR_ENABLE)
                        ha->flags.fcp_prio_enabled = 1;
                qla24xx_update_all_fcp_prio(vha);
-               bsg_job->reply->result = DID_OK;
+               bsg_reply->result = DID_OK;
                break;
        default:
                ret = -EINVAL;
@@ -237,13 +244,15 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
        }
 exit_fcp_prio_cfg:
        if (!ret)
-               bsg_job->job_done(bsg_job);
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        return ret;
 }
 
 static int
-qla2x00_process_els(struct fc_bsg_job *bsg_job)
+qla2x00_process_els(struct bsg_job *bsg_job)
 {
+       struct fc_bsg_request *bsg_request = bsg_job->request;
        struct fc_rport *rport;
        fc_port_t *fcport = NULL;
        struct Scsi_Host *host;
@@ -255,15 +264,15 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
        int rval =  (DRIVER_ERROR << 16);
        uint16_t nextlid = 0;
 
-       if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) {
-               rport = bsg_job->rport;
+       if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
+               rport = fc_bsg_to_rport(bsg_job);
                fcport = *(fc_port_t **) rport->dd_data;
                host = rport_to_shost(rport);
                vha = shost_priv(host);
                ha = vha->hw;
                type = "FC_BSG_RPT_ELS";
        } else {
-               host = bsg_job->shost;
+               host = fc_bsg_to_shost(bsg_job);
                vha = shost_priv(host);
                ha = vha->hw;
                type = "FC_BSG_HST_ELS_NOLOGIN";
@@ -296,7 +305,7 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
        }
 
        /* ELS request for rport */
-       if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) {
+       if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
                /* make sure the rport is logged in,
                 * if not perform fabric login
                 */
@@ -322,11 +331,11 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
                /* Initialize all required  fields of fcport */
                fcport->vha = vha;
                fcport->d_id.b.al_pa =
-                       bsg_job->request->rqst_data.h_els.port_id[0];
+                       bsg_request->rqst_data.h_els.port_id[0];
                fcport->d_id.b.area =
-                       bsg_job->request->rqst_data.h_els.port_id[1];
+                       bsg_request->rqst_data.h_els.port_id[1];
                fcport->d_id.b.domain =
-                       bsg_job->request->rqst_data.h_els.port_id[2];
+                       bsg_request->rqst_data.h_els.port_id[2];
                fcport->loop_id =
                        (fcport->d_id.b.al_pa == 0xFD) ?
                        NPH_FABRIC_CONTROLLER : NPH_F_PORT;
@@ -366,11 +375,11 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
        }
 
        sp->type =
-               (bsg_job->request->msgcode == FC_BSG_RPT_ELS ?
-               SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST);
+               (bsg_request->msgcode == FC_BSG_RPT_ELS ?
+                SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST);
        sp->name =
-               (bsg_job->request->msgcode == FC_BSG_RPT_ELS ?
-               "bsg_els_rpt" : "bsg_els_hst");
+               (bsg_request->msgcode == FC_BSG_RPT_ELS ?
+                "bsg_els_rpt" : "bsg_els_hst");
        sp->u.bsg_job = bsg_job;
        sp->free = qla2x00_bsg_sp_free;
        sp->done = qla2x00_bsg_job_done;
@@ -378,7 +387,7 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
        ql_dbg(ql_dbg_user, vha, 0x700a,
            "bsg rqst type: %s els type: %x - loop-id=%x "
            "portid=%-2x%02x%02x.\n", type,
-           bsg_job->request->rqst_data.h_els.command_code, fcport->loop_id,
+           bsg_request->rqst_data.h_els.command_code, fcport->loop_id,
            fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa);
 
        rval = qla2x00_start_sp(sp);
@@ -399,7 +408,7 @@ done_unmap_sg:
        goto done_free_fcport;
 
 done_free_fcport:
-       if (bsg_job->request->msgcode == FC_BSG_RPT_ELS)
+       if (bsg_request->msgcode == FC_BSG_RPT_ELS)
                kfree(fcport);
 done:
        return rval;
@@ -420,10 +429,11 @@ qla24xx_calc_ct_iocbs(uint16_t dsds)
 }
 
 static int
-qla2x00_process_ct(struct fc_bsg_job *bsg_job)
+qla2x00_process_ct(struct bsg_job *bsg_job)
 {
        srb_t *sp;
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = (DRIVER_ERROR << 16);
@@ -469,7 +479,7 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
        }
 
        loop_id =
-               (bsg_job->request->rqst_data.h_ct.preamble_word1 & 0xFF000000)
+               (bsg_request->rqst_data.h_ct.preamble_word1 & 0xFF000000)
                        >> 24;
        switch (loop_id) {
        case 0xFC:
@@ -500,9 +510,9 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
 
        /* Initialize all required  fields of fcport */
        fcport->vha = vha;
-       fcport->d_id.b.al_pa = bsg_job->request->rqst_data.h_ct.port_id[0];
-       fcport->d_id.b.area = bsg_job->request->rqst_data.h_ct.port_id[1];
-       fcport->d_id.b.domain = bsg_job->request->rqst_data.h_ct.port_id[2];
+       fcport->d_id.b.al_pa = bsg_request->rqst_data.h_ct.port_id[0];
+       fcport->d_id.b.area = bsg_request->rqst_data.h_ct.port_id[1];
+       fcport->d_id.b.domain = bsg_request->rqst_data.h_ct.port_id[2];
        fcport->loop_id = loop_id;
 
        /* Alloc SRB structure */
@@ -524,7 +534,7 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
        ql_dbg(ql_dbg_user, vha, 0x7016,
            "bsg rqst type: %s else type: %x - "
            "loop-id=%x portid=%02x%02x%02x.\n", type,
-           (bsg_job->request->rqst_data.h_ct.preamble_word2 >> 16),
+           (bsg_request->rqst_data.h_ct.preamble_word2 >> 16),
            fcport->loop_id, fcport->d_id.b.domain, fcport->d_id.b.area,
            fcport->d_id.b.al_pa);
 
@@ -697,9 +707,11 @@ done_set_internal:
 }
 
 static int
-qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
+qla2x00_process_loopback(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval;
@@ -780,9 +792,9 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
        elreq.rcv_dma = rsp_data_dma;
        elreq.transfer_size = req_data_len;
 
-       elreq.options = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+       elreq.options = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
        elreq.iteration_count =
-           bsg_job->request->rqst_data.h_vendor.vendor_cmd[2];
+           bsg_request->rqst_data.h_vendor.vendor_cmd[2];
 
        if (atomic_read(&vha->loop_state) == LOOP_READY &&
            (ha->current_topology == ISP_CFG_F ||
@@ -896,12 +908,12 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
                    "Vendor request %s failed.\n", type);
 
                rval = 0;
-               bsg_job->reply->result = (DID_ERROR << 16);
-               bsg_job->reply->reply_payload_rcv_len = 0;
+               bsg_reply->result = (DID_ERROR << 16);
+               bsg_reply->reply_payload_rcv_len = 0;
        } else {
                ql_dbg(ql_dbg_user, vha, 0x702d,
                    "Vendor request %s completed.\n", type);
-               bsg_job->reply->result = (DID_OK << 16);
+               bsg_reply->result = (DID_OK << 16);
                sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
                        bsg_job->reply_payload.sg_cnt, rsp_data,
                        rsp_data_len);
@@ -930,14 +942,17 @@ done_unmap_req_sg:
            bsg_job->request_payload.sg_list,
            bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
        if (!rval)
-               bsg_job->job_done(bsg_job);
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        return rval;
 }
 
 static int
-qla84xx_reset(struct fc_bsg_job *bsg_job)
+qla84xx_reset(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -948,7 +963,7 @@ qla84xx_reset(struct fc_bsg_job *bsg_job)
                return -EINVAL;
        }
 
-       flag = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+       flag = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
 
        rval = qla84xx_reset_chip(vha, flag == A84_ISSUE_RESET_DIAG_FW);
 
@@ -960,17 +975,20 @@ qla84xx_reset(struct fc_bsg_job *bsg_job)
        } else {
                ql_dbg(ql_dbg_user, vha, 0x7031,
                    "Vendor request 84xx reset completed.\n");
-               bsg_job->reply->result = DID_OK;
-               bsg_job->job_done(bsg_job);
+               bsg_reply->result = DID_OK;
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        }
 
        return rval;
 }
 
 static int
-qla84xx_updatefw(struct fc_bsg_job *bsg_job)
+qla84xx_updatefw(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        struct verify_chip_entry_84xx *mn = NULL;
@@ -1027,7 +1045,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
                goto done_free_fw_buf;
        }
 
-       flag = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+       flag = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
        fw_ver = le32_to_cpu(*((uint32_t *)((uint32_t *)fw_buf + 2)));
 
        memset(mn, 0, sizeof(struct access_chip_84xx));
@@ -1059,7 +1077,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
                    "Vendor request 84xx updatefw completed.\n");
 
                bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-               bsg_job->reply->result = DID_OK;
+               bsg_reply->result = DID_OK;
        }
 
        dma_pool_free(ha->s_dma_pool, mn, mn_dma);
@@ -1072,14 +1090,17 @@ done_unmap_sg:
                bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
 
        if (!rval)
-               bsg_job->job_done(bsg_job);
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        return rval;
 }
 
 static int
-qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
+qla84xx_mgmt_cmd(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        struct access_chip_84xx *mn = NULL;
@@ -1107,7 +1128,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
        memset(mn, 0, sizeof(struct access_chip_84xx));
        mn->entry_type = ACCESS_CHIP_IOCB_TYPE;
        mn->entry_count = 1;
-       ql84_mgmt = (void *)bsg_job->request + sizeof(struct fc_bsg_request);
+       ql84_mgmt = (void *)bsg_request + sizeof(struct fc_bsg_request);
        switch (ql84_mgmt->mgmt.cmd) {
        case QLA84_MGMT_READ_MEM:
        case QLA84_MGMT_GET_INFO:
@@ -1239,11 +1260,11 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
                    "Vendor request 84xx mgmt completed.\n");
 
                bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-               bsg_job->reply->result = DID_OK;
+               bsg_reply->result = DID_OK;
 
                if ((ql84_mgmt->mgmt.cmd == QLA84_MGMT_READ_MEM) ||
                        (ql84_mgmt->mgmt.cmd == QLA84_MGMT_GET_INFO)) {
-                       bsg_job->reply->reply_payload_rcv_len =
+                       bsg_reply->reply_payload_rcv_len =
                                bsg_job->reply_payload.payload_len;
 
                        sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
@@ -1267,14 +1288,17 @@ exit_mgmt:
        dma_pool_free(ha->s_dma_pool, mn, mn_dma);
 
        if (!rval)
-               bsg_job->job_done(bsg_job);
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        return rval;
 }
 
 static int
-qla24xx_iidma(struct fc_bsg_job *bsg_job)
+qla24xx_iidma(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        int rval = 0;
        struct qla_port_param *port_param = NULL;
@@ -1288,7 +1312,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
                return -EINVAL;
        }
 
-       port_param = (void *)bsg_job->request + sizeof(struct fc_bsg_request);
+       port_param = (void *)bsg_request + sizeof(struct fc_bsg_request);
        if (port_param->fc_scsi_addr.dest_type != EXT_DEF_TYPE_WWPN) {
                ql_log(ql_log_warn, vha, 0x7048,
                    "Invalid destination type.\n");
@@ -1343,24 +1367,26 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
                        bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
                                sizeof(struct qla_port_param);
 
-                       rsp_ptr = ((uint8_t *)bsg_job->reply) +
+                       rsp_ptr = ((uint8_t *)bsg_reply) +
                                sizeof(struct fc_bsg_reply);
 
                        memcpy(rsp_ptr, port_param,
                                sizeof(struct qla_port_param));
                }
 
-               bsg_job->reply->result = DID_OK;
-               bsg_job->job_done(bsg_job);
+               bsg_reply->result = DID_OK;
+               bsg_job_done(bsg_job, bsg_reply->result,
+                              bsg_reply->reply_payload_rcv_len);
        }
 
        return rval;
 }
 
 static int
-qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha,
+qla2x00_optrom_setup(struct bsg_job *bsg_job, scsi_qla_host_t *vha,
        uint8_t is_update)
 {
+       struct fc_bsg_request *bsg_request = bsg_job->request;
        uint32_t start = 0;
        int valid = 0;
        struct qla_hw_data *ha = vha->hw;
@@ -1368,7 +1394,7 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha,
        if (unlikely(pci_channel_offline(ha->pdev)))
                return -EINVAL;
 
-       start = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+       start = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
        if (start > ha->optrom_size) {
                ql_log(ql_log_warn, vha, 0x7055,
                    "start %d > optrom_size %d.\n", start, ha->optrom_size);
@@ -1427,9 +1453,10 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha,
 }
 
 static int
-qla2x00_read_optrom(struct fc_bsg_job *bsg_job)
+qla2x00_read_optrom(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1451,20 +1478,22 @@ qla2x00_read_optrom(struct fc_bsg_job *bsg_job)
            bsg_job->reply_payload.sg_cnt, ha->optrom_buffer,
            ha->optrom_region_size);
 
-       bsg_job->reply->reply_payload_rcv_len = ha->optrom_region_size;
-       bsg_job->reply->result = DID_OK;
+       bsg_reply->reply_payload_rcv_len = ha->optrom_region_size;
+       bsg_reply->result = DID_OK;
        vfree(ha->optrom_buffer);
        ha->optrom_buffer = NULL;
        ha->optrom_state = QLA_SWAITING;
        mutex_unlock(&ha->optrom_mutex);
-       bsg_job->job_done(bsg_job);
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return rval;
 }
 
 static int
-qla2x00_update_optrom(struct fc_bsg_job *bsg_job)
+qla2x00_update_optrom(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1486,19 +1515,21 @@ qla2x00_update_optrom(struct fc_bsg_job *bsg_job)
        ha->isp_ops->write_optrom(vha, ha->optrom_buffer,
            ha->optrom_region_start, ha->optrom_region_size);
 
-       bsg_job->reply->result = DID_OK;
+       bsg_reply->result = DID_OK;
        vfree(ha->optrom_buffer);
        ha->optrom_buffer = NULL;
        ha->optrom_state = QLA_SWAITING;
        mutex_unlock(&ha->optrom_mutex);
-       bsg_job->job_done(bsg_job);
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return rval;
 }
 
 static int
-qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job)
+qla2x00_update_fru_versions(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1509,7 +1540,7 @@ qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job)
        dma_addr_t sfp_dma;
        void *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma);
        if (!sfp) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_NO_MEMORY;
                goto done;
        }
@@ -1525,30 +1556,32 @@ qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job)
                    image->field_address.device, image->field_address.offset,
                    sizeof(image->field_info), image->field_address.option);
                if (rval) {
-                       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+                       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                            EXT_STATUS_MAILBOX;
                        goto dealloc;
                }
                image++;
        }
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
 
 dealloc:
        dma_pool_free(ha->s_dma_pool, sfp, sfp_dma);
 
 done:
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        return 0;
 }
 
 static int
-qla2x00_read_fru_status(struct fc_bsg_job *bsg_job)
+qla2x00_read_fru_status(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1557,7 +1590,7 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job)
        dma_addr_t sfp_dma;
        uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma);
        if (!sfp) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_NO_MEMORY;
                goto done;
        }
@@ -1571,7 +1604,7 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job)
        sr->status_reg = *sfp;
 
        if (rval) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_MAILBOX;
                goto dealloc;
        }
@@ -1579,24 +1612,26 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job)
        sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
            bsg_job->reply_payload.sg_cnt, sr, sizeof(*sr));
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
 
 dealloc:
        dma_pool_free(ha->s_dma_pool, sfp, sfp_dma);
 
 done:
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->reply_payload_rcv_len = sizeof(*sr);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->reply_payload_rcv_len = sizeof(*sr);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        return 0;
 }
 
 static int
-qla2x00_write_fru_status(struct fc_bsg_job *bsg_job)
+qla2x00_write_fru_status(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1605,7 +1640,7 @@ qla2x00_write_fru_status(struct fc_bsg_job *bsg_job)
        dma_addr_t sfp_dma;
        uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma);
        if (!sfp) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_NO_MEMORY;
                goto done;
        }
@@ -1619,28 +1654,30 @@ qla2x00_write_fru_status(struct fc_bsg_job *bsg_job)
            sizeof(sr->status_reg), sr->field_address.option);
 
        if (rval) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_MAILBOX;
                goto dealloc;
        }
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
 
 dealloc:
        dma_pool_free(ha->s_dma_pool, sfp, sfp_dma);
 
 done:
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        return 0;
 }
 
 static int
-qla2x00_write_i2c(struct fc_bsg_job *bsg_job)
+qla2x00_write_i2c(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1649,7 +1686,7 @@ qla2x00_write_i2c(struct fc_bsg_job *bsg_job)
        dma_addr_t sfp_dma;
        uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma);
        if (!sfp) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_NO_MEMORY;
                goto done;
        }
@@ -1662,28 +1699,30 @@ qla2x00_write_i2c(struct fc_bsg_job *bsg_job)
            i2c->device, i2c->offset, i2c->length, i2c->option);
 
        if (rval) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_MAILBOX;
                goto dealloc;
        }
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
 
 dealloc:
        dma_pool_free(ha->s_dma_pool, sfp, sfp_dma);
 
 done:
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        return 0;
 }
 
 static int
-qla2x00_read_i2c(struct fc_bsg_job *bsg_job)
+qla2x00_read_i2c(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = 0;
@@ -1692,7 +1731,7 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job)
        dma_addr_t sfp_dma;
        uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma);
        if (!sfp) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_NO_MEMORY;
                goto done;
        }
@@ -1704,7 +1743,7 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job)
                i2c->device, i2c->offset, i2c->length, i2c->option);
 
        if (rval) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_MAILBOX;
                goto dealloc;
        }
@@ -1713,24 +1752,26 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job)
        sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
            bsg_job->reply_payload.sg_cnt, i2c, sizeof(*i2c));
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = 0;
 
 dealloc:
        dma_pool_free(ha->s_dma_pool, sfp, sfp_dma);
 
 done:
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->reply_payload_rcv_len = sizeof(*i2c);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->reply_payload_rcv_len = sizeof(*i2c);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        return 0;
 }
 
 static int
-qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job)
+qla24xx_process_bidir_cmd(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        uint32_t rval = EXT_STATUS_OK;
@@ -1895,19 +1936,21 @@ done:
        /* Return an error vendor specific response
         * and complete the bsg request
         */
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = rval;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = rval;
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->reply_payload_rcv_len = 0;
-       bsg_job->reply->result = (DID_OK) << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->reply_payload_rcv_len = 0;
+       bsg_reply->result = (DID_OK) << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        /* Always return success, vendor rsp carries correct status */
        return 0;
 }
 
 static int
-qlafx00_mgmt_cmd(struct fc_bsg_job *bsg_job)
+qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        int rval = (DRIVER_ERROR << 16);
@@ -1919,7 +1962,7 @@ qlafx00_mgmt_cmd(struct fc_bsg_job *bsg_job)
 
        /* Copy the IOCB specific information */
        piocb_rqst = (struct qla_mt_iocb_rqst_fx00 *)
-           &bsg_job->request->rqst_data.h_vendor.vendor_cmd[1];
+           &bsg_request->rqst_data.h_vendor.vendor_cmd[1];
 
        /* Dump the vendor information */
        ql_dump_buffer(ql_dbg_user + ql_dbg_verbose , vha, 0x70cf,
@@ -2027,9 +2070,10 @@ done:
 }
 
 static int
-qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
+qla26xx_serdes_op(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        int rval = 0;
        struct qla_serdes_reg sr;
@@ -2042,13 +2086,13 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
        switch (sr.cmd) {
        case INT_SC_SERDES_WRITE_REG:
                rval = qla2x00_write_serdes_word(vha, sr.addr, sr.val);
-               bsg_job->reply->reply_payload_rcv_len = 0;
+               bsg_reply->reply_payload_rcv_len = 0;
                break;
        case INT_SC_SERDES_READ_REG:
                rval = qla2x00_read_serdes_word(vha, sr.addr, &sr.val);
                sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
                    bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr));
-               bsg_job->reply->reply_payload_rcv_len = sizeof(sr);
+               bsg_reply->reply_payload_rcv_len = sizeof(sr);
                break;
        default:
                ql_dbg(ql_dbg_user, vha, 0x708c,
@@ -2057,19 +2101,21 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
                break;
        }
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            rval ? EXT_STATUS_MAILBOX : 0;
 
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return 0;
 }
 
 static int
-qla8044_serdes_op(struct fc_bsg_job *bsg_job)
+qla8044_serdes_op(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        int rval = 0;
        struct qla_serdes_reg_ex sr;
@@ -2082,13 +2128,13 @@ qla8044_serdes_op(struct fc_bsg_job *bsg_job)
        switch (sr.cmd) {
        case INT_SC_SERDES_WRITE_REG:
                rval = qla8044_write_serdes_word(vha, sr.addr, sr.val);
-               bsg_job->reply->reply_payload_rcv_len = 0;
+               bsg_reply->reply_payload_rcv_len = 0;
                break;
        case INT_SC_SERDES_READ_REG:
                rval = qla8044_read_serdes_word(vha, sr.addr, &sr.val);
                sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
                    bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr));
-               bsg_job->reply->reply_payload_rcv_len = sizeof(sr);
+               bsg_reply->reply_payload_rcv_len = sizeof(sr);
                break;
        default:
                ql_dbg(ql_dbg_user, vha, 0x70cf,
@@ -2097,19 +2143,21 @@ qla8044_serdes_op(struct fc_bsg_job *bsg_job)
                break;
        }
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            rval ? EXT_STATUS_MAILBOX : 0;
 
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return 0;
 }
 
 static int
-qla27xx_get_flash_upd_cap(struct fc_bsg_job *bsg_job)
+qla27xx_get_flash_upd_cap(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        struct qla_flash_update_caps cap;
@@ -2125,21 +2173,23 @@ qla27xx_get_flash_upd_cap(struct fc_bsg_job *bsg_job)
 
        sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
            bsg_job->reply_payload.sg_cnt, &cap, sizeof(cap));
-       bsg_job->reply->reply_payload_rcv_len = sizeof(cap);
+       bsg_reply->reply_payload_rcv_len = sizeof(cap);
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            EXT_STATUS_OK;
 
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return 0;
 }
 
 static int
-qla27xx_set_flash_upd_cap(struct fc_bsg_job *bsg_job)
+qla27xx_set_flash_upd_cap(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        uint64_t online_fw_attr = 0;
@@ -2158,32 +2208,34 @@ qla27xx_set_flash_upd_cap(struct fc_bsg_job *bsg_job)
                         (uint64_t)ha->fw_attributes;
 
        if (online_fw_attr != cap.capabilities) {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_INVALID_PARAM;
                return -EINVAL;
        }
 
        if (cap.outage_duration < MAX_LOOP_TIMEOUT)  {
-               bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+               bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
                    EXT_STATUS_INVALID_PARAM;
                return -EINVAL;
        }
 
-       bsg_job->reply->reply_payload_rcv_len = 0;
+       bsg_reply->reply_payload_rcv_len = 0;
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            EXT_STATUS_OK;
 
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return 0;
 }
 
 static int
-qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job)
+qla27xx_get_bbcr_data(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        struct qla_bbcr_data bbcr;
@@ -2227,27 +2279,30 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job)
 done:
        sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
                bsg_job->reply_payload.sg_cnt, &bbcr, sizeof(bbcr));
-       bsg_job->reply->reply_payload_rcv_len = sizeof(bbcr);
+       bsg_reply->reply_payload_rcv_len = sizeof(bbcr);
 
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = EXT_STATUS_OK;
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = EXT_STATUS_OK;
 
        bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
        return 0;
 }
 
 static int
-qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
+qla2x00_get_priv_stats(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        struct qla_hw_data *ha = vha->hw;
        struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
        struct link_statistics *stats = NULL;
        dma_addr_t stats_dma;
        int rval;
-       uint32_t *cmd = bsg_job->request->rqst_data.h_vendor.vendor_cmd;
+       uint32_t *cmd = bsg_request->rqst_data.h_vendor.vendor_cmd;
        uint options = cmd[0] == QL_VND_GET_PRIV_STATS_EX ? cmd[1] : 0;
 
        if (test_bit(UNLOADING, &vha->dpc_flags))
@@ -2281,13 +2336,14 @@ qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
                        bsg_job->reply_payload.sg_cnt, stats, sizeof(*stats));
        }
 
-       bsg_job->reply->reply_payload_rcv_len = sizeof(*stats);
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_payload_rcv_len = sizeof(*stats);
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            rval ? EXT_STATUS_MAILBOX : EXT_STATUS_OK;
 
-       bsg_job->reply_len = sizeof(*bsg_job->reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_job->reply_len = sizeof(*bsg_reply);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
                stats, stats_dma);
@@ -2296,9 +2352,10 @@ qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
 }
 
 static int
-qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job)
+qla2x00_do_dport_diagnostics(struct bsg_job *bsg_job)
 {
-       struct Scsi_Host *host = bsg_job->shost;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
        scsi_qla_host_t *vha = shost_priv(host);
        int rval;
        struct qla_dport_diag *dd;
@@ -2323,13 +2380,14 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job)
                    bsg_job->reply_payload.sg_cnt, dd, sizeof(*dd));
        }
 
-       bsg_job->reply->reply_payload_rcv_len = sizeof(*dd);
-       bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
+       bsg_reply->reply_payload_rcv_len = sizeof(*dd);
+       bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
            rval ? EXT_STATUS_MAILBOX : EXT_STATUS_OK;
 
-       bsg_job->reply_len = sizeof(*bsg_job->reply);
-       bsg_job->reply->result = DID_OK << 16;
-       bsg_job->job_done(bsg_job);
+       bsg_job->reply_len = sizeof(*bsg_reply);
+       bsg_reply->result = DID_OK << 16;
+       bsg_job_done(bsg_job, bsg_reply->result,
+                      bsg_reply->reply_payload_rcv_len);
 
        kfree(dd);
 
@@ -2337,9 +2395,11 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job)
 }
 
 static int
-qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
+qla2x00_process_vendor_specific(struct bsg_job *bsg_job)
 {
-       switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) {
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+
+       switch (bsg_request->rqst_data.h_vendor.vendor_cmd[0]) {
        case QL_VND_LOOPBACK:
                return qla2x00_process_loopback(bsg_job);
 
@@ -2413,36 +2473,38 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
 }
 
 int
-qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
+qla24xx_bsg_request(struct bsg_job *bsg_job)
 {
+       struct fc_bsg_request *bsg_request = bsg_job->request;
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
        int ret = -EINVAL;
        struct fc_rport *rport;
        struct Scsi_Host *host;
        scsi_qla_host_t *vha;
 
        /* In case no data transferred. */
-       bsg_job->reply->reply_payload_rcv_len = 0;
+       bsg_reply->reply_payload_rcv_len = 0;
 
-       if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) {
-               rport = bsg_job->rport;
+       if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
+               rport = fc_bsg_to_rport(bsg_job);
                host = rport_to_shost(rport);
                vha = shost_priv(host);
        } else {
-               host = bsg_job->shost;
+               host = fc_bsg_to_shost(bsg_job);
                vha = shost_priv(host);
        }
 
        if (qla2x00_reset_active(vha)) {
                ql_dbg(ql_dbg_user, vha, 0x709f,
                    "BSG: ISP abort active/needed -- cmd=%d.\n",
-                   bsg_job->request->msgcode);
+                   bsg_request->msgcode);
                return -EBUSY;
        }
 
        ql_dbg(ql_dbg_user, vha, 0x7000,
-           "Entered %s msgcode=0x%x.\n", __func__, bsg_job->request->msgcode);
+           "Entered %s msgcode=0x%x.\n", __func__, bsg_request->msgcode);
 
-       switch (bsg_job->request->msgcode) {
+       switch (bsg_request->msgcode) {
        case FC_BSG_RPT_ELS:
        case FC_BSG_HST_ELS_NOLOGIN:
                ret = qla2x00_process_els(bsg_job);
@@ -2464,9 +2526,10 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
 }
 
 int
-qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job)
+qla24xx_bsg_timeout(struct bsg_job *bsg_job)
 {
-       scsi_qla_host_t *vha = shost_priv(bsg_job->shost);
+       struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+       scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
        struct qla_hw_data *ha = vha->hw;
        srb_t *sp;
        int cnt, que;
@@ -2494,13 +2557,13 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job)
                                                    "mbx abort_command "
                                                    "failed.\n");
                                                bsg_job->req->errors =
-                                               bsg_job->reply->result = -EIO;
+                                               bsg_reply->result = -EIO;
                                        } else {
                                                ql_dbg(ql_dbg_user, vha, 0x708a,
                                                    "mbx abort_command "
                                                    "success.\n");
                                                bsg_job->req->errors =
-                                               bsg_job->reply->result = 0;
+                                               bsg_reply->result = 0;
                                        }
                                        spin_lock_irqsave(&ha->hardware_lock, flags);
                                        goto done;
@@ -2510,7 +2573,7 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job)
        }
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
        ql_log(ql_log_info, vha, 0x708b, "SRB not found to abort.\n");
-       bsg_job->req->errors = bsg_job->reply->result = -ENXIO;
+       bsg_job->req->errors = bsg_reply->result = -ENXIO;
        return 0;
 
 done: