[infiniband] Always call ib_link_state_changed() in ib_smc_update()

ib_smc_update() potentially updates the Infiniband port state, and so
should almost always be followed by a call to ib_link_state_changed().
The one exception is the call made to ib_smc_update() before the
device is registered.

Fix by removing explicit calls to ib_link_state_changed() from drivers
using ib_smc_update(), including a call to ib_link_state_changed()
within ib_smc_update(), and creating a separate ib_smc_init() for use
prior to device registration.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2010-09-16 03:23:45 +01:00
parent 5e697b64a5
commit 09555826e9
4 changed files with 46 additions and 16 deletions

View File

@@ -1436,9 +1436,6 @@ static void arbel_event_port_state_change ( struct arbel *arbel,
/* Update MAD parameters */
ib_smc_update ( arbel->ibdev[port], arbel_mad );
/* Notify Infiniband core of link state change */
ib_link_state_changed ( arbel->ibdev[port] );
}
/**
@@ -2169,9 +2166,9 @@ static int arbel_probe ( struct pci_device *pci,
if ( ( rc = arbel_create_eq ( arbel ) ) != 0 )
goto err_create_eq;
/* Update MAD parameters */
/* Initialise parameters using SMC */
for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ )
ib_smc_update ( arbel->ibdev[i], arbel_mad );
ib_smc_init ( arbel->ibdev[i], arbel_mad );
/* Register Infiniband devices */
for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ ) {

View File

@@ -1821,9 +1821,6 @@ static void hermon_event_port_state_change ( struct hermon *hermon,
/* Update MAD parameters */
ib_smc_update ( hermon->ibdev[port], hermon_mad );
/* Notify Infiniband core of link state change */
ib_link_state_changed ( hermon->ibdev[port] );
}
/**
@@ -2826,10 +2823,9 @@ static int hermon_probe ( struct pci_device *pci,
if ( ( rc = hermon_configure_special_qps ( hermon ) ) != 0 )
goto err_conf_special_qps;
/* Update IPoIB MAC address */
for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
ib_smc_update ( hermon->ibdev[i], hermon_mad );
}
/* Initialise parameters using SMC */
for ( i = 0 ; i < hermon->cap.num_ports ; i++ )
ib_smc_init ( hermon->ibdev[i], hermon_mad );
/* Register Infiniband devices */
for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {