@@ -1,6 +1,6 @@
/*
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
* Copyright (c) 2009 HNR Consulting. All rights reserved.
*
@@ -582,5 +582,85 @@ const char *osm_get_sm_mgr_state_str(IN uint16_t state);
* SEE ALSO
*********/
+/****f* IBA Base: Types/ib_path_compare_rates
+* NAME
+* ib_path_compare_rates
+*
+* DESCRIPTION
+* Compares the encoded values for two path rates and
+* return value is based on the ordered comparison of
+* the path rates (or path rate equivalents).
+*
+* SYNOPSIS
+*/
+int ib_path_compare_rates(IN const int rate1, IN const int rate2);
+
+/*
+* PARAMETERS
+* rate1
+* [in] Encoded path rate 1.
+*
+* rate2
+* [in] Encoded path rate 2.
+*
+* RETURN VALUES
+* Returns an int indicating less than (-1), equal to (0), or
+* greater than (1) rate1 as compared with rate2.
+*
+* NOTES
+*
+* SEE ALSO
+*********/
+
+/****f* IBA Base: Types/ib_path_rate_get_prev
+* NAME
+* ib_path_rate_get_prev
+*
+* DESCRIPTION
+* Obtains encoded rate for the rate previous to the one requested.
+*
+* SYNOPSIS
+*/
+int ib_path_rate_get_prev(IN const int rate);
+
+/*
+* PARAMETERS
+* rate
+* [in] Encoded path rate.
+*
+* RETURN VALUES
+* Returns an int indicating encoded rate or
+* 0 if none can be found.
+*
+* NOTES
+*
+* SEE ALSO
+*********/
+
+/****f* IBA Base: Types/ib_path_rate_get_next
+* NAME
+* ib_path_rate_get_next
+*
+* DESCRIPTION
+* Obtains encoded rate for the rate subsequent to the one requested.
+*
+* SYNOPSIS
+*/
+int ib_path_rate_get_next(IN const int rate);
+
+/*
+* PARAMETERS
+* rate
+* [in] Encoded path rate.
+*
+* RETURN VALUES
+* Returns an int indicating encoded rate or
+* 0 if none can be found.
+*
+* NOTES
+*
+* SEE ALSO
+*********/
+
END_C_DECLS
#endif /* _OSM_HELPER_H_ */
@@ -57,5 +57,8 @@ OPENSM_1.5 {
osm_get_lsa_str;
osm_get_sm_mgr_signal_str;
osm_get_sm_mgr_state_str;
+ ib_path_compare_rates;
+ ib_path_rate_get_prev;
+ ib_path_rate_get_next;
local: *;
};
@@ -439,6 +439,27 @@ static const char *ib_sa_attr_str[] = {
#define OSM_SA_ATTR_STR_UNKNOWN_VAL (ARR_SIZE(ib_sa_attr_str) - 1)
+static int ordered_rates[] = {
+ 0, 0, /* 0, 1 - reserved */
+ 1, /* 2 - 2.5 Gbps */
+ 3, /* 3 - 10 Gbps */
+ 6, /* 4 - 30 Gbps */
+ 2, /* 5 - 5 Gbps */
+ 5, /* 6 - 20 Gbps */
+ 8, /* 7 - 40 Gbps */
+ 9, /* 8 - 60 Gbps */
+ 11, /* 9 - 80 Gbps */
+ 12, /* 10 - 120 Gbps */
+ 4, /* 11 - 14 Gbps (17 Gbps equiv) */
+ 10, /* 12 - 56 Gbps (68 Gbps equiv) */
+ 14, /* 13 - 112 Gbps (136 Gbps equiv) */
+ 15, /* 14 - 158 Gbps (204 Gbps equiv) */
+ 7, /* 15 - 25 Gbps (31.25 Gbps equiv) */
+ 13, /* 16 - 100 Gbps (125 Gbps equiv) */
+ 16, /* 17 - 200 Gbps (250 Gbps equiv) */
+ 17 /* 18 - 300 Gbps (375 Gbps equiv) */
+};
+
static int sprint_uint8_arr(char *buf, size_t size,
const uint8_t * arr, size_t len)
{
@@ -2295,3 +2316,62 @@ const char *osm_get_sm_mgr_state_str(IN uint16_t state)
sm_mgr_state_str[state] :
sm_mgr_state_str[ARR_SIZE(sm_mgr_state_str) - 1];
}
+
+int ib_path_compare_rates(IN const int rate1, IN const int rate2)
+{
+ int orate1 = 0, orate2 = 0;
+
+ CL_ASSERT(rate1 >= IB_MIN_RATE && rate1 <= IB_MAX_RATE);
+ CL_ASSERT(rate2 >= IB_MIN_RATE && rate2 <= IB_MAX_RATE);
+
+ if (rate1 <= IB_MAX_RATE)
+ orate1 = ordered_rates[rate1];
+ if (rate2 <= IB_MAX_RATE)
+ orate2 = ordered_rates[rate2];
+ if (orate1 < orate2)
+ return -1;
+ if (orate1 == orate2)
+ return 0;
+ return 1;
+}
+
+static int find_ordered_rate(IN const int rate)
+{
+ int i;
+
+ for (i = IB_MIN_RATE; i <= IB_MAX_RATE; i++) {
+ if (ordered_rates[i] == rate)
+ return i;
+ }
+ return 0;
+}
+
+int ib_path_rate_get_prev(IN const int rate)
+{
+ int orate;
+
+ CL_ASSERT(rate >= IB_MIN_RATE && rate <= IB_MAX_RATE);
+
+ if (rate <= IB_MIN_RATE)
+ return 0;
+ if (rate > IB_MAX_RATE)
+ return 0;
+ orate = ordered_rates[rate];
+ orate--;
+ return find_ordered_rate(orate);
+}
+
+int ib_path_rate_get_next(IN const int rate)
+{
+ int orate;
+
+ CL_ASSERT(rate >= IB_MIN_RATE && rate <= IB_MAX_RATE);
+
+ if (rate < IB_MIN_RATE)
+ return 0;
+ if (rate >= IB_MAX_RATE)
+ return 0;
+ orate = ordered_rates[rate];
+ orate++;
+ return find_ordered_rate(orate);
+}
for proper comparison and selector operation Rate enum was never is ascending order of actual underlying rates but even worse with newly added extended link speeds. Signed-off-by: Hal Rosenstock <hal@mellanox.com> --- Changes since v1: In find_ordered_rate, changed hard coded constant (2) into define (IB_MIN_RATE) Added asserts to ib_path_compare_rates, ib_path_rate_get_prev, and ib_path_rate_get_next -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html