Michal Suchanek 77923a
From 4a59ed8a077e0a4a6f52084c80c716b9936198ef Mon Sep 17 00:00:00 2001
Michal Suchanek 77923a
From: Tyrel Datwyler <tyreld@linux.ibm.com>
Michal Suchanek 77923a
Date: Thu, 11 Feb 2021 12:57:39 -0600
Michal Suchanek 77923a
Subject: [PATCH 1/4] ibmvfc: simplify handling of sub-CRQ initialization
Michal Suchanek 77923a
Michal Suchanek 77923a
References: bsc#1182632 ltc#191222
Michal Suchanek 77923a
Patch-mainline: submitted https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=229197
Michal Suchanek 77923a
Michal Suchanek 77923a
If ibmvfc_init_sub_crqs() fails ibmvfc_probe() simply parrots
Michal Suchanek 77923a
registration failure reported elsewhere, and futher
Michal Suchanek 77923a
vhost->scsi_scrq.scrq == NULL is indication enough to the driver that it
Michal Suchanek 77923a
has no sub-CRQs available. The mq_enabled check can also be moved into
Michal Suchanek 77923a
ibmvfc_init_sub_crqs() such that each caller doesn't have to gate the
Michal Suchanek 77923a
call with a mq_enabled check. Finally, in the case of sub-CRQ setup
Michal Suchanek 77923a
failure setting do_enquiry can be turned off to putting the driver into
Michal Suchanek 77923a
single queue fallback mode.
Michal Suchanek 77923a
Michal Suchanek 77923a
The aforementioned changes also simplify the next patch in the series
Michal Suchanek 77923a
that fixes a hard reset issue, by tying a sub-CRQ setup failure and
Michal Suchanek 77923a
do_enquiry logic into ibmvfc_init_sub_crqs().
Michal Suchanek 77923a
Michal Suchanek 77923a
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
Michal Suchanek 77923a
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Michal Suchanek 77923a
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek 77923a
---
Michal Suchanek 77923a
 drivers/scsi/ibmvscsi/ibmvfc.c | 21 ++++++++++-----------
Michal Suchanek 77923a
 1 file changed, 10 insertions(+), 11 deletions(-)
Michal Suchanek 77923a
Michal Suchanek 77923a
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
Michal Suchanek 77923a
index a72ad6d12579..7be437e9d805 100644
Michal Suchanek 77923a
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
Michal Suchanek 77923a
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
Michal Suchanek 77923a
@@ -5707,17 +5707,21 @@ static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index)
Michal Suchanek 77923a
 	LEAVE;
Michal Suchanek 77923a
 }
Michal Suchanek 77923a
 
Michal Suchanek 77923a
-static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
Michal Suchanek 77923a
+static void ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
Michal Suchanek 77923a
 {
Michal Suchanek 77923a
 	int i, j;
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 	ENTER;
Michal Suchanek 77923a
+	if (!vhost->mq_enabled)
Michal Suchanek 77923a
+		return;
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 	vhost->scsi_scrqs.scrqs = kcalloc(nr_scsi_hw_queues,
Michal Suchanek 77923a
 					  sizeof(*vhost->scsi_scrqs.scrqs),
Michal Suchanek 77923a
 					  GFP_KERNEL);
Michal Suchanek 77923a
-	if (!vhost->scsi_scrqs.scrqs)
Michal Suchanek 77923a
-		return -1;
Michal Suchanek 77923a
+	if (!vhost->scsi_scrqs.scrqs) {
Michal Suchanek 77923a
+		vhost->do_enquiry = 0;
Michal Suchanek 77923a
+		return;
Michal Suchanek 77923a
+	}
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 	for (i = 0; i < nr_scsi_hw_queues; i++) {
Michal Suchanek 77923a
 		if (ibmvfc_register_scsi_channel(vhost, i)) {
Michal Suchanek 77923a
@@ -5726,13 +5730,12 @@ static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
Michal Suchanek 77923a
 			kfree(vhost->scsi_scrqs.scrqs);
Michal Suchanek 77923a
 			vhost->scsi_scrqs.scrqs = NULL;
Michal Suchanek 77923a
 			vhost->scsi_scrqs.active_queues = 0;
Michal Suchanek 77923a
-			LEAVE;
Michal Suchanek 77923a
-			return -1;
Michal Suchanek 77923a
+			vhost->do_enquiry = 0;
Michal Suchanek 77923a
+			break;
Michal Suchanek 77923a
 		}
Michal Suchanek 77923a
 	}
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 	LEAVE;
Michal Suchanek 77923a
-	return 0;
Michal Suchanek 77923a
 }
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost)
Michal Suchanek 77923a
@@ -5999,11 +6002,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
Michal Suchanek 77923a
 		goto remove_shost;
Michal Suchanek 77923a
 	}
Michal Suchanek 77923a
 
Michal Suchanek 77923a
-	if (vhost->mq_enabled) {
Michal Suchanek 77923a
-		rc = ibmvfc_init_sub_crqs(vhost);
Michal Suchanek 77923a
-		if (rc)
Michal Suchanek 77923a
-			dev_warn(dev, "Failed to allocate Sub-CRQs. rc=%d\n", rc);
Michal Suchanek 77923a
-	}
Michal Suchanek 77923a
+	ibmvfc_init_sub_crqs(vhost);
Michal Suchanek 77923a
 
Michal Suchanek 77923a
 	if (shost_to_fc_host(shost)->rqst_q)
Michal Suchanek 77923a
 		blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1);
Michal Suchanek 77923a
-- 
Michal Suchanek 77923a
2.26.2
Michal Suchanek 77923a