diff --git a/src/drivers/infiniband/arbel.c b/src/drivers/infiniband/arbel.c index 129ec574..76855327 100644 --- a/src/drivers/infiniband/arbel.c +++ b/src/drivers/infiniband/arbel.c @@ -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++ ) { diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c index 8b5c2487..907865de 100644 --- a/src/drivers/infiniband/hermon.c +++ b/src/drivers/infiniband/hermon.c @@ -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++ ) { diff --git a/src/include/ipxe/ib_smc.h b/src/include/ipxe/ib_smc.h index d16a37fa..259d2cde 100644 --- a/src/include/ipxe/ib_smc.h +++ b/src/include/ipxe/ib_smc.h @@ -14,7 +14,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); typedef int ( * ib_local_mad_t ) ( struct ib_device *ibdev, union ib_mad *mad ); -extern int ib_smc_update ( struct ib_device *ibdev, - ib_local_mad_t local_mad ); +extern int ib_smc_init ( struct ib_device *ibdev, 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 */ diff --git a/src/net/infiniband/ib_smc.c b/src/net/infiniband/ib_smc.c index 5eef8255..2e0535ab 100644 --- a/src/net/infiniband/ib_smc.c +++ b/src/net/infiniband/ib_smc.c @@ -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; +}