[infiniband] Add node GUID as distinct from the first port GUID

iPXE currently uses the first port's port GUID as the node GUID,
rather than using the (possibly distinct) real node GUID.  This can
confuse opensm during the handover to a loaded OS: it thinks the port
already belongs to a different node and so discards our port
information with a warning message about duplicate ports.  Everything
is picked up correctly on the second subnet sweep, after opensm has
established that the "old" node no longer exists, but this can delay
link-up unnecessarily by several seconds.

Fix by using the real node GUID.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2010-09-15 23:10:15 +01:00
parent 3e8e2773de
commit 42cf4a720c
7 changed files with 93 additions and 51 deletions

View File

@@ -2364,8 +2364,10 @@ static int linda_probe ( struct pci_device *pci,
goto err_init_i2c;
/* Read EEPROM parameters */
if ( ( rc = linda_read_eeprom ( linda, &ibdev->gid.s.guid ) ) != 0 )
if ( ( rc = linda_read_eeprom ( linda, &ibdev->node_guid ) ) != 0 )
goto err_read_eeprom;
memcpy ( &ibdev->gid.s.guid, &ibdev->node_guid,
sizeof ( ibdev->gid.s.guid ) );
/* Initialise send datapath */
if ( ( rc = linda_init_send ( linda ) ) != 0 )

View File

@@ -2357,6 +2357,8 @@ static int qib7322_probe ( struct pci_device *pci,
IB_LINK_WIDTH_4X; /* 1x does not work */
ibdev->link_speed_enabled = ibdev->link_speed_supported =
IB_LINK_SPEED_SDR; /* to avoid need for link tuning */
memcpy ( &ibdev->node_guid, &qib7322->guid,
sizeof ( ibdev->node_guid ) );
memcpy ( &ibdev->gid.s.guid, &qib7322->guid,
sizeof ( ibdev->gid.s.guid ) );
assert ( ( ibdev->gid.s.guid.bytes[7] & i ) == 0 );