Message ID | 1467287137-25366-1-git-send-email-felix@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
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); >
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 --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);
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(+)