@@ -469,6 +469,8 @@ static u8 ib_rate_to_delay[IB_RATE_120_GBPS + 1] = {
469
469
#define IB_7322_LT_STATE_RECOVERIDLE 0x0f
470
470
#define IB_7322_LT_STATE_CFGENH 0x10
471
471
#define IB_7322_LT_STATE_CFGTEST 0x11
472
+ #define IB_7322_LT_STATE_CFGWAITRMTTEST 0x12
473
+ #define IB_7322_LT_STATE_CFGWAITENH 0x13
472
474
473
475
/* link state machine states from IBC */
474
476
#define IB_7322_L_STATE_DOWN 0x0
@@ -498,8 +500,10 @@ static const u8 qib_7322_physportstate[0x20] = {
498
500
IB_PHYSPORTSTATE_LINK_ERR_RECOVER ,
499
501
[IB_7322_LT_STATE_CFGENH ] = IB_PHYSPORTSTATE_CFG_ENH ,
500
502
[IB_7322_LT_STATE_CFGTEST ] = IB_PHYSPORTSTATE_CFG_TRAIN ,
501
- [0x12 ] = IB_PHYSPORTSTATE_CFG_TRAIN ,
502
- [0x13 ] = IB_PHYSPORTSTATE_CFG_WAIT_ENH ,
503
+ [IB_7322_LT_STATE_CFGWAITRMTTEST ] =
504
+ IB_PHYSPORTSTATE_CFG_TRAIN ,
505
+ [IB_7322_LT_STATE_CFGWAITENH ] =
506
+ IB_PHYSPORTSTATE_CFG_WAIT_ENH ,
503
507
[0x14 ] = IB_PHYSPORTSTATE_CFG_TRAIN ,
504
508
[0x15 ] = IB_PHYSPORTSTATE_CFG_TRAIN ,
505
509
[0x16 ] = IB_PHYSPORTSTATE_CFG_TRAIN ,
@@ -1692,7 +1696,9 @@ static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst)
1692
1696
break ;
1693
1697
}
1694
1698
1695
- if (ibclt == IB_7322_LT_STATE_CFGTEST &&
1699
+ if (((ibclt >= IB_7322_LT_STATE_CFGTEST &&
1700
+ ibclt <= IB_7322_LT_STATE_CFGWAITENH ) ||
1701
+ ibclt == IB_7322_LT_STATE_LINKUP ) &&
1696
1702
(ibcst & SYM_MASK (IBCStatusA_0 , LinkSpeedQDR ))) {
1697
1703
force_h1 (ppd );
1698
1704
ppd -> cpspec -> qdr_reforce = 1 ;
@@ -7301,12 +7307,17 @@ static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data,
7301
7307
static void serdes_7322_los_enable (struct qib_pportdata * ppd , int enable )
7302
7308
{
7303
7309
u64 data = qib_read_kreg_port (ppd , krp_serdesctrl );
7304
- printk (KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS %s\n" ,
7305
- ppd -> dd -> unit , ppd -> port , (enable ? "on" : "off" ));
7306
- if (enable )
7310
+ u8 state = SYM_FIELD (data , IBSerdesCtrl_0 , RXLOSEN );
7311
+
7312
+ if (enable && !state ) {
7313
+ printk (KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS on\n" ,
7314
+ ppd -> dd -> unit , ppd -> port );
7307
7315
data |= SYM_MASK (IBSerdesCtrl_0 , RXLOSEN );
7308
- else
7316
+ } else if (!enable && state ) {
7317
+ printk (KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS off\n" ,
7318
+ ppd -> dd -> unit , ppd -> port );
7309
7319
data &= ~SYM_MASK (IBSerdesCtrl_0 , RXLOSEN );
7320
+ }
7310
7321
qib_write_kreg_port (ppd , krp_serdesctrl , data );
7311
7322
}
7312
7323
0 commit comments