|
@@ -469,6 +469,8 @@ static u8 ib_rate_to_delay[IB_RATE_120_GBPS + 1] = {
|
|
#define IB_7322_LT_STATE_RECOVERIDLE 0x0f
|
|
#define IB_7322_LT_STATE_RECOVERIDLE 0x0f
|
|
#define IB_7322_LT_STATE_CFGENH 0x10
|
|
#define IB_7322_LT_STATE_CFGENH 0x10
|
|
#define IB_7322_LT_STATE_CFGTEST 0x11
|
|
#define IB_7322_LT_STATE_CFGTEST 0x11
|
|
|
|
+#define IB_7322_LT_STATE_CFGWAITRMTTEST 0x12
|
|
|
|
+#define IB_7322_LT_STATE_CFGWAITENH 0x13
|
|
|
|
|
|
/* link state machine states from IBC */
|
|
/* link state machine states from IBC */
|
|
#define IB_7322_L_STATE_DOWN 0x0
|
|
#define IB_7322_L_STATE_DOWN 0x0
|
|
@@ -498,8 +500,10 @@ static const u8 qib_7322_physportstate[0x20] = {
|
|
IB_PHYSPORTSTATE_LINK_ERR_RECOVER,
|
|
IB_PHYSPORTSTATE_LINK_ERR_RECOVER,
|
|
[IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH,
|
|
[IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH,
|
|
[IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
- [0x12] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
|
|
- [0x13] = IB_PHYSPORTSTATE_CFG_WAIT_ENH,
|
|
|
|
|
|
+ [IB_7322_LT_STATE_CFGWAITRMTTEST] =
|
|
|
|
+ IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
|
|
+ [IB_7322_LT_STATE_CFGWAITENH] =
|
|
|
|
+ IB_PHYSPORTSTATE_CFG_WAIT_ENH,
|
|
[0x14] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[0x14] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[0x15] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[0x15] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[0x16] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
[0x16] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
|
@@ -1692,7 +1696,9 @@ static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ibclt == IB_7322_LT_STATE_CFGTEST &&
|
|
|
|
|
|
+ if (((ibclt >= IB_7322_LT_STATE_CFGTEST &&
|
|
|
|
+ ibclt <= IB_7322_LT_STATE_CFGWAITENH) ||
|
|
|
|
+ ibclt == IB_7322_LT_STATE_LINKUP) &&
|
|
(ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) {
|
|
(ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) {
|
|
force_h1(ppd);
|
|
force_h1(ppd);
|
|
ppd->cpspec->qdr_reforce = 1;
|
|
ppd->cpspec->qdr_reforce = 1;
|
|
@@ -7301,12 +7307,17 @@ static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data,
|
|
static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable)
|
|
static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable)
|
|
{
|
|
{
|
|
u64 data = qib_read_kreg_port(ppd, krp_serdesctrl);
|
|
u64 data = qib_read_kreg_port(ppd, krp_serdesctrl);
|
|
- printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS %s\n",
|
|
|
|
- ppd->dd->unit, ppd->port, (enable ? "on" : "off"));
|
|
|
|
- if (enable)
|
|
|
|
|
|
+ u8 state = SYM_FIELD(data, IBSerdesCtrl_0, RXLOSEN);
|
|
|
|
+
|
|
|
|
+ if (enable && !state) {
|
|
|
|
+ printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS on\n",
|
|
|
|
+ ppd->dd->unit, ppd->port);
|
|
data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
|
data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
|
- else
|
|
|
|
|
|
+ } else if (!enable && state) {
|
|
|
|
+ printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS off\n",
|
|
|
|
+ ppd->dd->unit, ppd->port);
|
|
data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
|
data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
|
|
|
+ }
|
|
qib_write_kreg_port(ppd, krp_serdesctrl, data);
|
|
qib_write_kreg_port(ppd, krp_serdesctrl, data);
|
|
}
|
|
}
|
|
|
|
|