*********/\r
\r
\r
+/****f* IPOIB/ipoib_mac_from_mlx_guid\r
+* NAME\r
+* ipoib_mac_from_sst_guid\r
+*\r
+* DESCRIPTION\r
+* Generates an ethernet MAC address given a Mellanox port GUID.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static inline ib_api_status_t\r
+ipoib_mac_from_mlx_guid(\r
+ IN const net64_t port_guid,\r
+ OUT mac_addr_t* const p_mac_addr )\r
+{\r
+ const uint8_t *p_guid = (const uint8_t*)&port_guid;\r
+ uint32_t low24;\r
+\r
+ /* Port guid is in network byte order. OUI is in lower 3 bytes. */\r
+ ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 );\r
+\r
+ if( (port_guid & CL_HTON64( 0x000000ffff0000 )) !=\r
+ CL_HTON64(0x00000002000000))\r
+ {\r
+ return IB_INVALID_GUID;\r
+ }\r
+\r
+ low24 = ((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF);\r
+\r
+ p_mac_addr->addr[0] = p_guid[0];\r
+ p_mac_addr->addr[1] = p_guid[1];\r
+ p_mac_addr->addr[2] = p_guid[2];\r
+ p_mac_addr->addr[3] = (uint8_t)(low24 >> 16);\r
+ p_mac_addr->addr[4] = (uint8_t)(low24 >> 8);\r
+ p_mac_addr->addr[5] = (uint8_t)low24;\r
+ \r
+ return IB_SUCCESS;\r
+}\r
+/*\r
+* PARAMETERS\r
+* port_guid\r
+* The port GUID, in network byte order, for which to generate a\r
+* MAC address.\r
+*\r
+* p_mac_addr\r
+* Pointer to a mac address in which to store the results.\r
+*\r
+* RETURN VALUES\r
+* IB_SUCCESS\r
+* The MAC address was successfully converted.\r
+*\r
+* IB_INVALID_GUID\r
+* The port GUID provided was not a known GUID format.\r
+*\r
+* NOTES\r
+* The algorithm to convert portGuid to MAC address is as per DN0074, and\r
+* assumes a 2 port HCA.\r
+*\r
+* SEE ALSO\r
+* IPOIB\r
+*********/\r
+\r
+\r
/****f* IPOIB/ipoib_mac_from_guid\r
* NAME\r
* ipoib_mac_from_guid\r
if( status == IB_SUCCESS )\r
return IB_SUCCESS;\r
}\r
-\r
+ if( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 )\r
+ {\r
+ status = ipoib_mac_from_mlx_guid( port_guid, p_mac_addr );\r
+ if( status == IB_SUCCESS )\r
+ return IB_SUCCESS;\r
+ }\r
+ \r
/* Value of zero is reserved. */\r
laa = cl_atomic_inc( &g_ipoib.laa_idx );\r
\r
*********/\r
\r
\r
-/****f* IPOIB/ipoib_guid_from_mac\r
+/****f* IPOIB/ipoib_sst_guid_from_mac\r
* NAME\r
-* ipoib_guid_from_mac\r
+* ipoib_sst_guid_from_mac\r
*\r
* DESCRIPTION\r
* Generates a port GUID given an ethernet MAC address.\r
* SYNOPSIS\r
*/\r
static inline ib_api_status_t\r
-ipoib_guid_from_mac(\r
+ipoib_sst_guid_from_mac(\r
IN const mac_addr_t mac,\r
OUT net64_t* const p_port_guid )\r
{\r
*********/\r
\r
\r
+/****f* IPOIB/ipoib_mlx_guid_from_mac\r
+* NAME\r
+* ipoib_mlx_guid_from_mac\r
+*\r
+* DESCRIPTION\r
+* Generates a port GUID given an ethernet MAC address.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static inline ib_api_status_t\r
+ipoib_mlx_guid_from_mac(\r
+ IN const mac_addr_t mac,\r
+ OUT net64_t* const p_port_guid )\r
+{\r
+ uint8_t *p_guid = (uint8_t*)p_port_guid;\r
+ uint32_t low24;\r
+\r
+ /* MAC address is in network byte order. OUI is in lower 3 bytes. */\r
+ if( mac.addr[0] != 0x00 || \r
+ mac.addr[1] != 0x02 || \r
+ mac.addr[2] != 0xc9 )\r
+ {\r
+ return IB_INVALID_GUID;\r
+ }\r
+\r
+ low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
+\r
+ /* OUI */\r
+ p_guid[0] = mac.addr[0];\r
+ p_guid[1] = mac.addr[1];\r
+ p_guid[2] = mac.addr[2];\r
+ p_guid[3] = 0x02;\r
+ p_guid[4] = 0x00;\r
+ /* Serial Number */\r
+ p_guid[5] = (uint8_t)(low24 >> 16);\r
+ p_guid[6] = (uint8_t)(low24 >> 8);\r
+ p_guid[7] = (uint8_t)low24;\r
+ \r
+ return IB_SUCCESS;\r
+}\r
+/*\r
+* PARAMETERS\r
+* port_guid\r
+* The port GUID, in network byte order, for which to generate a\r
+* MAC address.\r
+*\r
+* p_mac_addr\r
+* Pointer to a mac address in which to store the results.\r
+*\r
+* RETURN VALUES\r
+* IB_SUCCESS\r
+* The MAC address was successfully converted.\r
+*\r
+* IB_INVALID_GUID\r
+* The port GUID provided was not a known GUID format.\r
+*\r
+* NOTES\r
+* The algorithm to convert portGuid to MAC address is as \r
+*\r
+* SEE ALSO\r
+* IPOIB\r
+*********/\r
\r
\r
#ifdef __cplusplus\r