[PATCH] cxl: Ignore CAPI adapters misplaced in switched slots

Subsystems: char and misc drivers, the rest

STALE3721d

3 messages, 3 authors, 2016-07-01 · open the first message on its own page

[PATCH] cxl: Ignore CAPI adapters misplaced in switched slots

From: Philippe Bergheaud <hidden>
Date: 2016-06-30 11:45:48

One should not attempt to switch a PHB into CAPI mode if there is
a switch between the PHB and the adapter. This patch modifies the
cxl driver to ignore CAPI adapters misplaced in switched slots.

Signed-off-by: Philippe Bergheaud <redacted>
---
This patch fixes Bz 142217.

 drivers/misc/cxl/pci.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index a08fcc8..2f978ed 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1280,6 +1280,30 @@ static void cxl_pci_remove_adapter(struct cxl *adapter)
 	device_unregister(&adapter->dev);
 }
 
+#define CXL_MAX_PCIEX_PARENT 2
+
+static int cxl_slot_is_switched(struct pci_dev *dev)
+{
+	struct device_node *np;
+	int depth = 0;
+	const __be32 *prop;
+
+	if (!(np = pci_device_to_OF_node(dev))) {
+		pr_err("cxl: np = NULL\n");
+		return -ENODEV;
+	}
+	of_node_get(np);
+	while (np) {
+		np = of_get_next_parent(np);
+		prop = of_get_property(np, "device_type", NULL);
+		if (!prop || strcmp((char *)prop, "pciex"))
+			break;
+		depth++;
+	}
+	of_node_put(np);
+	return (depth > CXL_MAX_PCIEX_PARENT);
+}
+
 static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
 	struct cxl *adapter;
@@ -1291,6 +1315,11 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
 		return -ENODEV;
 	}
 
+	if (cxl_slot_is_switched(dev)) {
+		dev_dbg(&dev->dev, "cxl_init_adapter: Ignoring switched slot device\n");
+		return -ENODEV;
+	}
+
 	if (cxl_verbose)
 		dump_cxl_config_space(dev);
 
-- 
2.8.0

Re: [PATCH] cxl: Ignore CAPI adapters misplaced in switched slots

From: Ian Munsie <hidden>
Date: 2016-06-30 17:02:29

Thanks Philippe - this looks like a decent solution to the problem (and
I intend to use this for the upcoming cx4 support as well).

Acked-by: Ian Munsie <redacted>

Excerpts from Philippe Bergheaud's message of 2016-06-30 13:45:37 +0200:
quoted hunk
One should not attempt to switch a PHB into CAPI mode if there is
a switch between the PHB and the adapter. This patch modifies the
cxl driver to ignore CAPI adapters misplaced in switched slots.

Signed-off-by: Philippe Bergheaud <redacted>
---
This patch fixes Bz 142217.

 drivers/misc/cxl/pci.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index a08fcc8..2f978ed 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1280,6 +1280,30 @@ static void cxl_pci_remove_adapter(struct cxl *adapter)
     device_unregister(&adapter->dev);
 }
 
+#define CXL_MAX_PCIEX_PARENT 2
+
+static int cxl_slot_is_switched(struct pci_dev *dev)
+{
+    struct device_node *np;
+    int depth = 0;
+    const __be32 *prop;
+
+    if (!(np = pci_device_to_OF_node(dev))) {
+        pr_err("cxl: np = NULL\n");
+        return -ENODEV;
+    }
+    of_node_get(np);
+    while (np) {
+        np = of_get_next_parent(np);
+        prop = of_get_property(np, "device_type", NULL);
+        if (!prop || strcmp((char *)prop, "pciex"))
+            break;
+        depth++;
+    }
+    of_node_put(np);
+    return (depth > CXL_MAX_PCIEX_PARENT);
+}
+
 static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
     struct cxl *adapter;
@@ -1291,6 +1315,11 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
         return -ENODEV;
     }
 
+    if (cxl_slot_is_switched(dev)) {
+        dev_dbg(&dev->dev, "cxl_init_adapter: Ignoring switched slot device\n");
+        return -ENODEV;
+    }
+
     if (cxl_verbose)
         dump_cxl_config_space(dev);
 

Re: [PATCH] cxl: Ignore CAPI adapters misplaced in switched slots

From: Frederic Barrat <hidden>
Date: 2016-07-01 08:53:53

Salut Philippe,

Le 30/06/2016 13:45, Philippe Bergheaud a écrit :
+	if (cxl_slot_is_switched(dev)) {
+		dev_dbg(&dev->dev, "cxl_init_adapter: Ignoring switched slot device\n");
+		return -ENODEV;
+	}

I think it would be useful for the user who has inserted the card in the 
wrong slot to be notified, i.e. raise the level of the message. 
Otherwise he would be wondering why the card is not recognized.

   Fred
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help