mirror of
https://github.com/ipxe/ipxe
synced 2025-12-26 01:22:37 +03:00
[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:
@@ -123,13 +123,13 @@ static int ib_smc_get_pkey_table ( struct ib_device *ibdev,
|
||||
}
|
||||
|
||||
/**
|
||||
* Get MAD parameters
|
||||
* Get Infiniband parameters using SMC
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v local_mad Method for issuing local MADs
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int ib_smc_update ( struct ib_device *ibdev, ib_local_mad_t local_mad ) {
|
||||
static int ib_smc_get ( struct ib_device *ibdev, ib_local_mad_t local_mad ) {
|
||||
union ib_mad mad;
|
||||
struct ib_port_info *port_info = &mad.smp.smp_data.port_info;
|
||||
struct ib_guid_info *guid_info = &mad.smp.smp_data.guid_info;
|
||||
@@ -174,3 +174,40 @@ int ib_smc_update ( struct ib_device *ibdev, ib_local_mad_t local_mad ) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise Infiniband parameters using SMC
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v local_mad Method for issuing local MADs
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int ib_smc_init ( struct ib_device *ibdev, ib_local_mad_t local_mad ) {
|
||||
int rc;
|
||||
|
||||
/* Get MAD parameters */
|
||||
if ( ( rc = ib_smc_get ( ibdev, local_mad ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update Infiniband parameters using SMC
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v local_mad Method for issuing local MADs
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int ib_smc_update ( struct ib_device *ibdev, ib_local_mad_t local_mad ) {
|
||||
int rc;
|
||||
|
||||
/* Get MAD parameters */
|
||||
if ( ( rc = ib_smc_get ( ibdev, local_mad ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
/* Notify Infiniband core of potential link state change */
|
||||
ib_link_state_changed ( ibdev );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user