Commit b020cc6c authored by Kleber Sacilotto de Souza's avatar Kleber Sacilotto de Souza Committed by Benjamin Herrenschmidt

powerpc/pseries: Fix regression on PCI link speed

Commit 5091f0c9 (powerpc/pseries: Fix PCIE link speed endian issue)
introduced a regression on the PCI link speed detection using the
device-tree property. The ibm,pcie-link-speed-stats property is composed
of two 32-bit integers, the first one being the maxinum link speed and
the second the current link speed. The changes introduced by the
aforementioned commit are considering just the first integer.

Fix this issue by changing how the property is accessed, using the
helper functions to properly access the array of values. The explicit
byte swapping is not needed anymore here, since it's done by the helper
functions.
Signed-off-by: default avatarKleber Sacilotto de Souza <klebers@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 1a18a664
...@@ -113,7 +113,8 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) ...@@ -113,7 +113,8 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
{ {
struct device_node *dn, *pdn; struct device_node *dn, *pdn;
struct pci_bus *bus; struct pci_bus *bus;
const __be32 *pcie_link_speed_stats; u32 pcie_link_speed_stats[2];
int rc;
bus = bridge->bus; bus = bridge->bus;
...@@ -122,20 +123,21 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) ...@@ -122,20 +123,21 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
return 0; return 0;
for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) {
pcie_link_speed_stats = of_get_property(pdn, rc = of_property_read_u32_array(pdn,
"ibm,pcie-link-speed-stats", NULL); "ibm,pcie-link-speed-stats",
if (pcie_link_speed_stats) &pcie_link_speed_stats[0], 2);
if (!rc)
break; break;
} }
of_node_put(pdn); of_node_put(pdn);
if (!pcie_link_speed_stats) { if (rc) {
pr_err("no ibm,pcie-link-speed-stats property\n"); pr_err("no ibm,pcie-link-speed-stats property\n");
return 0; return 0;
} }
switch (be32_to_cpup(pcie_link_speed_stats)) { switch (pcie_link_speed_stats[0]) {
case 0x01: case 0x01:
bus->max_bus_speed = PCIE_SPEED_2_5GT; bus->max_bus_speed = PCIE_SPEED_2_5GT;
break; break;
...@@ -147,7 +149,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) ...@@ -147,7 +149,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
break; break;
} }
switch (be32_to_cpup(pcie_link_speed_stats)) { switch (pcie_link_speed_stats[1]) {
case 0x01: case 0x01:
bus->cur_bus_speed = PCIE_SPEED_2_5GT; bus->cur_bus_speed = PCIE_SPEED_2_5GT;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment