mirror of https://github.com/ipxe/ipxe.git
[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>pull/1/head
parent
5e697b64a5
commit
09555826e9
|
@ -1436,9 +1436,6 @@ static void arbel_event_port_state_change ( struct arbel *arbel,
|
||||||
|
|
||||||
/* Update MAD parameters */
|
/* Update MAD parameters */
|
||||||
ib_smc_update ( arbel->ibdev[port], arbel_mad );
|
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 )
|
if ( ( rc = arbel_create_eq ( arbel ) ) != 0 )
|
||||||
goto err_create_eq;
|
goto err_create_eq;
|
||||||
|
|
||||||
/* Update MAD parameters */
|
/* Initialise parameters using SMC */
|
||||||
for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ )
|
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 */
|
/* Register Infiniband devices */
|
||||||
for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ ) {
|
for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ ) {
|
||||||
|
|
|
@ -1821,9 +1821,6 @@ static void hermon_event_port_state_change ( struct hermon *hermon,
|
||||||
|
|
||||||
/* Update MAD parameters */
|
/* Update MAD parameters */
|
||||||
ib_smc_update ( hermon->ibdev[port], hermon_mad );
|
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 )
|
if ( ( rc = hermon_configure_special_qps ( hermon ) ) != 0 )
|
||||||
goto err_conf_special_qps;
|
goto err_conf_special_qps;
|
||||||
|
|
||||||
/* Update IPoIB MAC address */
|
/* Initialise parameters using SMC */
|
||||||
for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
|
for ( i = 0 ; i < hermon->cap.num_ports ; i++ )
|
||||||
ib_smc_update ( hermon->ibdev[i], hermon_mad );
|
ib_smc_init ( hermon->ibdev[i], hermon_mad );
|
||||||
}
|
|
||||||
|
|
||||||
/* Register Infiniband devices */
|
/* Register Infiniband devices */
|
||||||
for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
|
for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
|
||||||
|
|
|
@ -14,7 +14,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
typedef int ( * ib_local_mad_t ) ( struct ib_device *ibdev,
|
typedef int ( * ib_local_mad_t ) ( struct ib_device *ibdev,
|
||||||
union ib_mad *mad );
|
union ib_mad *mad );
|
||||||
|
|
||||||
extern int ib_smc_update ( struct ib_device *ibdev,
|
extern int ib_smc_init ( struct ib_device *ibdev, ib_local_mad_t local_mad );
|
||||||
ib_local_mad_t local_mad );
|
extern int ib_smc_update ( struct ib_device *ibdev, ib_local_mad_t local_mad );
|
||||||
|
|
||||||
#endif /* _IPXE_IB_SMC_H */
|
#endif /* _IPXE_IB_SMC_H */
|
||||||
|
|
|
@ -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 ibdev Infiniband device
|
||||||
* @v local_mad Method for issuing local MADs
|
* @v local_mad Method for issuing local MADs
|
||||||
* @ret rc Return status code
|
* @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;
|
union ib_mad mad;
|
||||||
struct ib_port_info *port_info = &mad.smp.smp_data.port_info;
|
struct ib_port_info *port_info = &mad.smp.smp_data.port_info;
|
||||||
struct ib_guid_info *guid_info = &mad.smp.smp_data.guid_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;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue