diff mbox

cxl: Ignore CAPI adapters misplaced in switched slots

Message ID 1467287137-25366-1-git-send-email-felix@linux.vnet.ibm.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Philippe Bergheaud June 30, 2016, 11:45 a.m. UTC
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 <felix@linux.vnet.ibm.com>
---
This patch fixes Bz 142217.

 drivers/misc/cxl/pci.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

Comments

Ian Munsie June 30, 2016, 5:02 p.m. UTC | #1
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 <imunsie@au1.ibm.com>

Excerpts from Philippe Bergheaud's message of 2016-06-30 13:45:37 +0200:
> 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 <felix@linux.vnet.ibm.com>
> ---
> 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);
>
Frederic Barrat July 1, 2016, 8:53 a.m. UTC | #2
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
diff mbox

Patch

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);