forked from Minki/linux
net/mlx4_core: Report PCIe link properties with pcie_print_link_status()
Use pcie_print_link_status() to report PCIe link speed and possible limitations instead of implementing this in the driver itself. Signed-off-by: Tal Gilboa <talgi@mellanox.com> Signed-off-by: Tariq Toukan <tariqt@mellanox.com> [bhelgaas: changelog] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
9e506a7b51
commit
190b509c8d
@ -623,85 +623,6 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx4_get_pcie_dev_link_caps(struct mlx4_dev *dev,
|
||||
enum pci_bus_speed *speed,
|
||||
enum pcie_link_width *width)
|
||||
{
|
||||
u32 lnkcap1, lnkcap2;
|
||||
int err1, err2;
|
||||
|
||||
#define PCIE_MLW_CAP_SHIFT 4 /* start of MLW mask in link capabilities */
|
||||
|
||||
*speed = PCI_SPEED_UNKNOWN;
|
||||
*width = PCIE_LNK_WIDTH_UNKNOWN;
|
||||
|
||||
err1 = pcie_capability_read_dword(dev->persist->pdev, PCI_EXP_LNKCAP,
|
||||
&lnkcap1);
|
||||
err2 = pcie_capability_read_dword(dev->persist->pdev, PCI_EXP_LNKCAP2,
|
||||
&lnkcap2);
|
||||
if (!err2 && lnkcap2) { /* PCIe r3.0-compliant */
|
||||
if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB)
|
||||
*speed = PCIE_SPEED_8_0GT;
|
||||
else if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_5_0GB)
|
||||
*speed = PCIE_SPEED_5_0GT;
|
||||
else if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_2_5GB)
|
||||
*speed = PCIE_SPEED_2_5GT;
|
||||
}
|
||||
if (!err1) {
|
||||
*width = (lnkcap1 & PCI_EXP_LNKCAP_MLW) >> PCIE_MLW_CAP_SHIFT;
|
||||
if (!lnkcap2) { /* pre-r3.0 */
|
||||
if (lnkcap1 & PCI_EXP_LNKCAP_SLS_5_0GB)
|
||||
*speed = PCIE_SPEED_5_0GT;
|
||||
else if (lnkcap1 & PCI_EXP_LNKCAP_SLS_2_5GB)
|
||||
*speed = PCIE_SPEED_2_5GT;
|
||||
}
|
||||
}
|
||||
|
||||
if (*speed == PCI_SPEED_UNKNOWN || *width == PCIE_LNK_WIDTH_UNKNOWN) {
|
||||
return err1 ? err1 :
|
||||
err2 ? err2 : -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx4_check_pcie_caps(struct mlx4_dev *dev)
|
||||
{
|
||||
enum pcie_link_width width, width_cap;
|
||||
enum pci_bus_speed speed, speed_cap;
|
||||
int err;
|
||||
|
||||
#define PCIE_SPEED_STR(speed) \
|
||||
(speed == PCIE_SPEED_8_0GT ? "8.0GT/s" : \
|
||||
speed == PCIE_SPEED_5_0GT ? "5.0GT/s" : \
|
||||
speed == PCIE_SPEED_2_5GT ? "2.5GT/s" : \
|
||||
"Unknown")
|
||||
|
||||
err = mlx4_get_pcie_dev_link_caps(dev, &speed_cap, &width_cap);
|
||||
if (err) {
|
||||
mlx4_warn(dev,
|
||||
"Unable to determine PCIe device BW capabilities\n");
|
||||
return;
|
||||
}
|
||||
|
||||
err = pcie_get_minimum_link(dev->persist->pdev, &speed, &width);
|
||||
if (err || speed == PCI_SPEED_UNKNOWN ||
|
||||
width == PCIE_LNK_WIDTH_UNKNOWN) {
|
||||
mlx4_warn(dev,
|
||||
"Unable to determine PCI device chain minimum BW\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (width != width_cap || speed != speed_cap)
|
||||
mlx4_warn(dev,
|
||||
"PCIe BW is different than device's capability\n");
|
||||
|
||||
mlx4_info(dev, "PCIe link speed is %s, device supports %s\n",
|
||||
PCIE_SPEED_STR(speed), PCIE_SPEED_STR(speed_cap));
|
||||
mlx4_info(dev, "PCIe link width is x%d, device supports x%d\n",
|
||||
width, width_cap);
|
||||
return;
|
||||
}
|
||||
|
||||
/*The function checks if there are live vf, return the num of them*/
|
||||
static int mlx4_how_many_lives_vf(struct mlx4_dev *dev)
|
||||
{
|
||||
@ -3475,7 +3396,7 @@ slave_start:
|
||||
* express device capabilities are under-satisfied by the bus.
|
||||
*/
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_check_pcie_caps(dev);
|
||||
pcie_print_link_status(dev->persist->pdev);
|
||||
|
||||
/* In master functions, the communication channel must be initialized
|
||||
* after obtaining its address from fw */
|
||||
|
Loading…
Reference in New Issue
Block a user