Refactor discover-target event creation so it can be shared by both SCSI
and NVMe/FC discovery.

Introduce a helper that takes a protocol-specific channel group, selects
the correct discover-target opcode, and maps the corresponding discovery
buffer into the MAD.

This is a preparatory cleanup for issuing protocol-specific discovery
MADs in later patches.

Signed-off-by: Tyrel Datwyler <[email protected]>
---
 drivers/scsi/ibmvscsi/ibmvfc-core.c | 39 ++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc-core.c 
b/drivers/scsi/ibmvscsi/ibmvfc-core.c
index 93c32fa162f8..8186e9321af5 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc-core.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c
@@ -5023,6 +5023,32 @@ static void ibmvfc_discover_targets_done(struct 
ibmvfc_event *evt)
        wake_up(&vhost->work_wait_q);
 }
 
+static struct ibmvfc_event *ibmvfc_get_disc_event(struct ibmvfc_channels 
*channels)
+{
+       struct ibmvfc_discover_targets *mad;
+       struct ibmvfc_host *vhost = ibmvfc_channels_to_vhost(channels);
+       struct ibmvfc_event *evt = ibmvfc_get_reserved_event(&vhost->crq);
+
+       if (!evt)
+               return NULL;
+
+       ibmvfc_init_event(evt, ibmvfc_discover_targets_done, IBMVFC_MAD_FORMAT);
+       mad = &evt->iu.discover_targets;
+       memset(mad, 0, sizeof(*mad));
+       mad->common.version = cpu_to_be32(1);
+       if (channels->protocol == IBMVFC_PROTO_SCSI)
+               mad->common.opcode = cpu_to_be32(IBMVFC_DISC_TARGETS);
+       else
+               mad->common.opcode = cpu_to_be32(IBMVFC_DISC_NVMF_TARGETS);
+       mad->common.length = cpu_to_be16(sizeof(*mad));
+       mad->bufflen = cpu_to_be32(channels->disc_buf_sz);
+       mad->buffer.va = cpu_to_be64(channels->disc_buf_dma);
+       mad->buffer.len = cpu_to_be32(channels->disc_buf_sz);
+       mad->flags = cpu_to_be32(IBMVFC_DISC_TGT_PORT_ID_WWPN_LIST);
+
+       return evt;
+}
+
 /**
  * ibmvfc_discover_targets - Send Discover Targets MAD
  * @vhost:     ibmvfc host struct
@@ -5030,8 +5056,7 @@ static void ibmvfc_discover_targets_done(struct 
ibmvfc_event *evt)
  **/
 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost)
 {
-       struct ibmvfc_discover_targets *mad;
-       struct ibmvfc_event *evt = ibmvfc_get_reserved_event(&vhost->crq);
+       struct ibmvfc_event *evt = ibmvfc_get_disc_event(&vhost->scsi_scrqs);
        int level = IBMVFC_DEFAULT_LOG_LEVEL;
 
        if (!evt) {
@@ -5040,16 +5065,6 @@ static void ibmvfc_discover_targets(struct ibmvfc_host 
*vhost)
                return;
        }
 
-       ibmvfc_init_event(evt, ibmvfc_discover_targets_done, IBMVFC_MAD_FORMAT);
-       mad = &evt->iu.discover_targets;
-       memset(mad, 0, sizeof(*mad));
-       mad->common.version = cpu_to_be32(1);
-       mad->common.opcode = cpu_to_be32(IBMVFC_DISC_TARGETS);
-       mad->common.length = cpu_to_be16(sizeof(*mad));
-       mad->bufflen = cpu_to_be32(vhost->scsi_scrqs.disc_buf_sz);
-       mad->buffer.va = cpu_to_be64(vhost->scsi_scrqs.disc_buf_dma);
-       mad->buffer.len = cpu_to_be32(vhost->scsi_scrqs.disc_buf_sz);
-       mad->flags = cpu_to_be32(IBMVFC_DISC_TGT_PORT_ID_WWPN_LIST);
        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
 
        if (!ibmvfc_send_event(evt, vhost, default_timeout))
-- 
2.54.0


Reply via email to