All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eddie James <eajames@linux.ibm.com>
To: linux-fsi@lists.ozlabs.org
Cc: linux-kernel@vger.kernel.org, jk@ozlabs.org, joel@jms.id.au,
	alistair@popple.id.au, andrew@aj.id.au, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org,
	devicetree@vger.kernel.org
Subject: [PATCH 11/14] fsi: Improve master indexing
Date: Mon, 12 Jun 2023 14:56:54 -0500	[thread overview]
Message-ID: <20230612195657.245125-12-eajames@linux.ibm.com> (raw)
In-Reply-To: <20230612195657.245125-1-eajames@linux.ibm.com>

Master indexing is problematic if a hub is rescanned while the
root master is being rescanned. Move the IDA free below the device
unregistration, lock the scan mutex in the probe function, and
request a specific idx in the hub driver.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/fsi/fsi-core.c       | 41 ++++++++++++++++++++++--------------
 drivers/fsi/fsi-master-hub.c |  2 ++
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index ec4d02264391..503061a6740b 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -1327,46 +1327,55 @@ static struct class fsi_master_class = {
 int fsi_master_register(struct fsi_master *master)
 {
 	int rc;
-	struct device_node *np;
 
 	mutex_init(&master->scan_lock);
-	master->idx = ida_alloc(&master_ida, GFP_KERNEL);
+
+	if (master->idx) {
+		master->idx = ida_alloc_range(&master_ida, master->idx,
+					      master->idx, GFP_KERNEL);
+		if (master->idx < 0)
+			master->idx = ida_alloc(&master_ida, GFP_KERNEL);
+	} else {
+		master->idx = ida_alloc(&master_ida, GFP_KERNEL);
+	}
+
 	if (master->idx < 0)
 		return master->idx;
 
-	dev_set_name(&master->dev, "fsi%d", master->idx);
+	if (!dev_name(&master->dev))
+		dev_set_name(&master->dev, "fsi%d", master->idx);
+
 	master->dev.class = &fsi_master_class;
 
+	mutex_lock(&master->scan_lock);
 	rc = device_register(&master->dev);
 	if (rc) {
 		ida_free(&master_ida, master->idx);
-		return rc;
-	}
+	} else {
+		struct device_node *np = dev_of_node(&master->dev);
 
-	np = dev_of_node(&master->dev);
-	if (!of_property_read_bool(np, "no-scan-on-init")) {
-		mutex_lock(&master->scan_lock);
-		fsi_master_scan(master);
-		mutex_unlock(&master->scan_lock);
+		if (!of_property_read_bool(np, "no-scan-on-init"))
+			fsi_master_scan(master);
 	}
 
-	return 0;
+	mutex_unlock(&master->scan_lock);
+	return rc;
 }
 EXPORT_SYMBOL_GPL(fsi_master_register);
 
 void fsi_master_unregister(struct fsi_master *master)
 {
-	trace_fsi_master_unregister(master);
+	int idx = master->idx;
 
-	if (master->idx >= 0) {
-		ida_free(&master_ida, master->idx);
-		master->idx = -1;
-	}
+	trace_fsi_master_unregister(master);
 
 	mutex_lock(&master->scan_lock);
 	fsi_master_unscan(master);
+	master->n_links = 0;
 	mutex_unlock(&master->scan_lock);
+
 	device_unregister(&master->dev);
+	ida_free(&master_ida, idx);
 }
 EXPORT_SYMBOL_GPL(fsi_master_unregister);
 
diff --git a/drivers/fsi/fsi-master-hub.c b/drivers/fsi/fsi-master-hub.c
index 6d8b6e8854e5..36da643b3201 100644
--- a/drivers/fsi/fsi-master-hub.c
+++ b/drivers/fsi/fsi-master-hub.c
@@ -12,6 +12,7 @@
 #include <linux/slab.h>
 
 #include "fsi-master.h"
+#include "fsi-slave.h"
 
 #define FSI_ENGID_HUB_MASTER		0x1c
 
@@ -229,6 +230,7 @@ static int hub_master_probe(struct device *dev)
 	hub->master.dev.release = hub_master_release;
 	hub->master.dev.of_node = of_node_get(dev_of_node(dev));
 
+	hub->master.idx = fsi_dev->slave->link + 1;
 	hub->master.n_links = links;
 	hub->master.read = hub_master_read;
 	hub->master.write = hub_master_write;
-- 
2.31.1


  parent reply	other threads:[~2023-06-12 19:57 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-12 19:56 [PATCH 00/14] fsi: Miscellaneous fixes and I2C Responder driver Eddie James
2023-06-12 19:56 ` [PATCH 01/14] fsi: Move fsi_slave structure definition to header Eddie James
2023-06-12 19:56 ` [PATCH 02/14] fsi: Add aliased device numbering Eddie James
2023-06-12 19:56 ` [PATCH 03/14] fsi: Use of_match_table for bus matching if specified Eddie James
2023-08-17 15:46   ` Rob Herring
2023-06-12 19:56 ` [PATCH 04/14] fsi: sbefifo: Don't check status during probe Eddie James
2023-06-12 19:56 ` [PATCH 05/14] fsi: sbefifo: Add configurable in-command timeout Eddie James
2023-06-12 19:56 ` [PATCH 06/14] fsi: sbefifo: Remove limits on user-specified read timeout Eddie James
2023-06-12 19:56 ` [PATCH 07/14] fsi: aspeed: Reset master errors after CFAM reset Eddie James
2023-06-12 19:56 ` [PATCH 08/14] fsi: core: Add trace events for scan and unregister Eddie James
2023-06-12 19:56 ` [PATCH 09/14] fsi: core: Fix legacy minor numbering Eddie James
2023-06-12 19:56 ` [PATCH 10/14] fsi: core: Switch to ida_alloc/free Eddie James
2023-06-12 19:56 ` Eddie James [this message]
2023-08-09  7:08   ` [PATCH 11/14] fsi: Improve master indexing Joel Stanley
2023-08-09 11:55     ` Joel Stanley
2023-08-09 16:08       ` Eddie James
2023-08-09 16:21     ` Eddie James
2023-06-12 19:56 ` [PATCH 12/14] dt-bindings: fsi: Document the IBM I2C Responder virtual FSI master Eddie James
2023-06-12 19:56 ` [PATCH 13/14] fsi: Add " Eddie James
2023-06-12 19:56 ` [PATCH 14/14] fsi: Add I2C Responder SCOM driver Eddie James
2023-08-17 15:56   ` Rob Herring

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230612195657.245125-12-eajames@linux.ibm.com \
    --to=eajames@linux.ibm.com \
    --cc=alistair@popple.id.au \
    --cc=andrew@aj.id.au \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=jk@ozlabs.org \
    --cc=joel@jms.id.au \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-fsi@lists.ozlabs.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.