From: Wei Lin Guay Date: Tue, 30 Aug 2016 20:17:01 +0000 (+0200) Subject: sif: ipd: Fix incorrect calculation of ipd from static rate X-Git-Tag: v4.1.12-92~80^2~6 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=08d6dcf1b65a8846968dec297dcbee1a29eced16;p=users%2Fjedix%2Flinux-maple.git sif: ipd: Fix incorrect calculation of ipd from static rate Orabug: 24449061 The ipd is calculated wrongly because it compares the active speed enum with the value return from ib_rate_to_mult. Thus, this patch converts the PSIF Active speed enum to a multiple of the base rate of SDR (2.5 Gbps). Signed-off-by: Wei Lin Guay Reviewed-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_defs.c b/drivers/infiniband/hw/sif/sif_defs.c index f68a7a38753e..ed95ee69f766 100644 --- a/drivers/infiniband/hw/sif/sif_defs.c +++ b/drivers/infiniband/hw/sif/sif_defs.c @@ -456,6 +456,29 @@ enum ib_mtu sif2ib_path_mtu(enum psif_path_mtu mtu) } } +/* psif_port_speed to mult - convert the IB speed definition to a + * multiple of the base rate of 2.5 Gbps. E.g, PSIF_SPEED_EDR will + * be converted to 10, as 25 Gbps is 10 * 2.5 Gbps. + */ +const int psif_port_speed_to_mult(enum psif_port_speed speed) +{ + switch (speed) { + default: + case PSIF_PORT_SPEED_FIELD_MAX: + case PSIF_SPEED_SDR: + return 1; + case PSIF_SPEED_DDR: + return 2; + case PSIF_SPEED_QDR: + return 4; + case PSIF_SPEED_FDR10: + return 4; + case PSIF_SPEED_FDR: + return 5; + case PSIF_SPEED_EDR: + return 10; + } +} /* TBD: IB datastructure dump functions - remove/replace? */ diff --git a/drivers/infiniband/hw/sif/sif_defs.h b/drivers/infiniband/hw/sif/sif_defs.h index 3c1975e823c2..e027cc6fde80 100644 --- a/drivers/infiniband/hw/sif/sif_defs.h +++ b/drivers/infiniband/hw/sif/sif_defs.h @@ -67,6 +67,7 @@ enum psif_migration ib2sif_mig_state(enum ib_mig_state mstate); enum ib_mtu sif2ib_path_mtu(enum psif_path_mtu mtu); enum psif_path_mtu ib2sif_path_mtu(enum ib_mtu mtu); enum kernel_ulp_type sif_find_kernel_ulp_caller(void); +const int psif_port_speed_to_mult(enum psif_port_speed speed); /* TBD: IB datastructure dump functions - remove/replace? */ const char *ib_event2str(enum ib_event_type e); diff --git a/drivers/infiniband/hw/sif/sif_query.c b/drivers/infiniband/hw/sif/sif_query.c index 2f18fe81b95e..4e0a103a4891 100644 --- a/drivers/infiniband/hw/sif/sif_query.c +++ b/drivers/infiniband/hw/sif/sif_query.c @@ -162,6 +162,7 @@ int sif_calc_ipd(struct sif_dev *sdev, u8 port, enum ib_rate static_rate, u8 *i int path = ib_rate_to_mult(static_rate); int link; u8 active_speed = sdev->port[port - 1].active_speed; + int active_mult = psif_port_speed_to_mult((enum psif_port_speed)active_speed); u8 active_width = sdev->port[port - 1].active_width; if (static_rate == IB_RATE_PORT_CURRENT) { @@ -180,8 +181,8 @@ int sif_calc_ipd(struct sif_dev *sdev, u8 port, enum ib_rate static_rate, u8 *i return -EDEADLK; } - /* 2^active_width * active_speed */ - link = (1 << active_width)*active_speed; + /* 2^active_width * mult SDR of active speed */ + link = (1 << active_width)*active_mult; if (path >= link) *ipd = 0;