@@ -603,33 +603,27 @@ static void apply_tunings(
603
603
"Applying TX settings" );
604
604
}
605
605
606
+ /* Must be holding the QSFP i2c resource */
606
607
static int tune_active_qsfp (struct hfi1_pportdata * ppd , u32 * ptr_tx_preset ,
607
608
u32 * ptr_rx_preset , u32 * ptr_total_atten )
608
609
{
609
610
int ret ;
610
611
u16 lss = ppd -> link_speed_supported , lse = ppd -> link_speed_enabled ;
611
612
u8 * cache = ppd -> qsfp_info .cache ;
612
613
613
- ret = acquire_chip_resource (ppd -> dd , qsfp_resource (ppd -> dd ), QSFP_WAIT );
614
- if (ret ) {
615
- dd_dev_err (ppd -> dd , "%s: hfi%d: cannot lock i2c chain\n" ,
616
- __func__ , (int )ppd -> dd -> hfi1_id );
617
- return ret ;
618
- }
619
-
620
614
ppd -> qsfp_info .limiting_active = 1 ;
621
615
622
616
ret = set_qsfp_tx (ppd , 0 );
623
617
if (ret )
624
- goto bail_unlock ;
618
+ return ret ;
625
619
626
620
ret = qual_power (ppd );
627
621
if (ret )
628
- goto bail_unlock ;
622
+ return ret ;
629
623
630
624
ret = qual_bitrate (ppd );
631
625
if (ret )
632
- goto bail_unlock ;
626
+ return ret ;
633
627
634
628
if (ppd -> qsfp_info .reset_needed ) {
635
629
reset_qsfp (ppd );
@@ -641,7 +635,7 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
641
635
642
636
ret = set_qsfp_high_power (ppd );
643
637
if (ret )
644
- goto bail_unlock ;
638
+ return ret ;
645
639
646
640
if (cache [QSFP_EQ_INFO_OFFS ] & 0x4 ) {
647
641
ret = get_platform_config_field (
@@ -651,7 +645,7 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
651
645
ptr_tx_preset , 4 );
652
646
if (ret ) {
653
647
* ptr_tx_preset = OPA_INVALID_INDEX ;
654
- goto bail_unlock ;
648
+ return ret ;
655
649
}
656
650
} else {
657
651
ret = get_platform_config_field (
@@ -661,7 +655,7 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
661
655
ptr_tx_preset , 4 );
662
656
if (ret ) {
663
657
* ptr_tx_preset = OPA_INVALID_INDEX ;
664
- goto bail_unlock ;
658
+ return ret ;
665
659
}
666
660
}
667
661
@@ -670,7 +664,7 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
670
664
PORT_TABLE_RX_PRESET_IDX , ptr_rx_preset , 4 );
671
665
if (ret ) {
672
666
* ptr_rx_preset = OPA_INVALID_INDEX ;
673
- goto bail_unlock ;
667
+ return ret ;
674
668
}
675
669
676
670
if ((lss & OPA_LINK_SPEED_25G ) && (lse & OPA_LINK_SPEED_25G ))
@@ -690,8 +684,6 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
690
684
691
685
ret = set_qsfp_tx (ppd , 1 );
692
686
693
- bail_unlock :
694
- release_chip_resource (ppd -> dd , qsfp_resource (ppd -> dd ));
695
687
return ret ;
696
688
}
697
689
@@ -846,6 +838,14 @@ void tune_serdes(struct hfi1_pportdata *ppd)
846
838
break ;
847
839
case PORT_TYPE_QSFP :
848
840
if (qsfp_mod_present (ppd )) {
841
+ ret = acquire_chip_resource (ppd -> dd ,
842
+ qsfp_resource (ppd -> dd ),
843
+ QSFP_WAIT );
844
+ if (ret ) {
845
+ dd_dev_err (ppd -> dd , "%s: hfi%d: cannot lock i2c chain\n" ,
846
+ __func__ , (int )ppd -> dd -> hfi1_id );
847
+ goto bail ;
848
+ }
849
849
refresh_qsfp_cache (ppd , & ppd -> qsfp_info );
850
850
851
851
if (ppd -> qsfp_info .cache_valid ) {
@@ -860,17 +860,17 @@ void tune_serdes(struct hfi1_pportdata *ppd)
860
860
* update the cache to reflect the changes
861
861
*/
862
862
refresh_qsfp_cache (ppd , & ppd -> qsfp_info );
863
- if (ret )
864
- goto bail ;
865
-
866
863
limiting_active =
867
864
ppd -> qsfp_info .limiting_active ;
868
865
} else {
869
866
dd_dev_err (dd ,
870
867
"%s: Reading QSFP memory failed\n" ,
871
868
__func__ );
872
- goto bail ;
869
+ ret = - EINVAL ; /* a fail indication */
873
870
}
871
+ release_chip_resource (ppd -> dd , qsfp_resource (ppd -> dd ));
872
+ if (ret )
873
+ goto bail ;
874
874
} else {
875
875
ppd -> offline_disabled_reason =
876
876
HFI1_ODR_MASK (
0 commit comments