Add a helper routine for initializing a Cancel MAD. This will be useful
for a channelized client that needs to send a Cancel commands down every
channel commands were sent for a particular LUN.

Signed-off-by: Tyrel Datwyler <tyr...@linux.ibm.com>
Reviewed-by: Brian King <brk...@linux.vnet.ibm.com>
---
 drivers/scsi/ibmvscsi/ibmvfc.c | 67 ++++++++++++++++++++--------------
 1 file changed, 39 insertions(+), 28 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index d65de320252e..ec3db5a6baf3 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -2286,6 +2286,44 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host 
*vhost, void *device,
        return SUCCESS;
 }
 
+static struct ibmvfc_event *ibmvfc_init_tmf(struct ibmvfc_host *vhost,
+                                    struct scsi_device *sdev,
+                                    int type)
+{
+       struct scsi_target *starget = scsi_target(sdev);
+       struct fc_rport *rport = starget_to_rport(starget);
+       struct ibmvfc_event *evt;
+       struct ibmvfc_tmf *tmf;
+
+       evt = ibmvfc_get_event(vhost);
+       ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_MAD_FORMAT);
+
+       tmf = &evt->iu.tmf;
+       memset(tmf, 0, sizeof(*tmf));
+       if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
+               tmf->common.version = cpu_to_be32(2);
+               tmf->target_wwpn = cpu_to_be64(rport->port_name);
+       } else {
+               tmf->common.version = cpu_to_be32(1);
+       }
+       tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
+       tmf->common.length = cpu_to_be16(sizeof(*tmf));
+       tmf->scsi_id = cpu_to_be64(rport->port_id);
+       int_to_scsilun(sdev->lun, &tmf->lun);
+       if (!ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPRESS_ABTS))
+               type &= ~IBMVFC_TMF_SUPPRESS_ABTS;
+       if (vhost->state == IBMVFC_ACTIVE)
+               tmf->flags = cpu_to_be32((type | IBMVFC_TMF_LUA_VALID));
+       else
+               tmf->flags = cpu_to_be32(((type & IBMVFC_TMF_SUPPRESS_ABTS) | 
IBMVFC_TMF_LUA_VALID));
+       tmf->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
+       tmf->my_cancel_key = cpu_to_be32((unsigned long)starget->hostdata);
+
+       init_completion(&evt->comp);
+
+       return evt;
+}
+
 /**
  * ibmvfc_cancel_all - Cancel all outstanding commands to the device
  * @sdev:      scsi device to cancel commands
@@ -2300,9 +2338,6 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, 
void *device,
 static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
 {
        struct ibmvfc_host *vhost = shost_priv(sdev->host);
-       struct scsi_target *starget = scsi_target(sdev);
-       struct fc_rport *rport = starget_to_rport(starget);
-       struct ibmvfc_tmf *tmf;
        struct ibmvfc_event *evt, *found_evt;
        union ibmvfc_iu rsp;
        int rsp_rc = -EBUSY;
@@ -2327,32 +2362,8 @@ static int ibmvfc_cancel_all(struct scsi_device *sdev, 
int type)
        }
 
        if (vhost->logged_in) {
-               evt = ibmvfc_get_event(vhost);
-               ibmvfc_init_event(evt, ibmvfc_sync_completion, 
IBMVFC_MAD_FORMAT);
-
-               tmf = &evt->iu.tmf;
-               memset(tmf, 0, sizeof(*tmf));
-               if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
-                       tmf->common.version = cpu_to_be32(2);
-                       tmf->target_wwpn = cpu_to_be64(rport->port_name);
-               } else {
-                       tmf->common.version = cpu_to_be32(1);
-               }
-               tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
-               tmf->common.length = cpu_to_be16(sizeof(*tmf));
-               tmf->scsi_id = cpu_to_be64(rport->port_id);
-               int_to_scsilun(sdev->lun, &tmf->lun);
-               if (!ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPRESS_ABTS))
-                       type &= ~IBMVFC_TMF_SUPPRESS_ABTS;
-               if (vhost->state == IBMVFC_ACTIVE)
-                       tmf->flags = cpu_to_be32((type | IBMVFC_TMF_LUA_VALID));
-               else
-                       tmf->flags = cpu_to_be32(((type & 
IBMVFC_TMF_SUPPRESS_ABTS) | IBMVFC_TMF_LUA_VALID));
-               tmf->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
-               tmf->my_cancel_key = cpu_to_be32((unsigned 
long)starget->hostdata);
-
+               evt = ibmvfc_init_tmf(vhost, sdev, type);
                evt->sync_iu = &rsp;
-               init_completion(&evt->comp);
                rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
        }
 
-- 
2.27.0

Reply via email to