mirror of
git://nv-tegra.nvidia.com/kernel/nvethernetrm.git
synced 2025-12-24 02:22:16 +03:00
osi: Enable BASE-R FEC support for 25G
Bug 4674473 Change-Id: Ic4a0f67158449094a9489afbe8de8d2efc0fdf99 Signed-off-by: Mahesh Patil <maheshp@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/kernel/nvethernetrm/+/3316844 GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com> Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com> Reviewed-by: Ajay Gupta <ajayg@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: Srinivas Ramachandran <srinivasra@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
c13a414c34
commit
df0be09573
@@ -364,32 +364,36 @@ nve32_t xlgpcs_start(struct osi_core_priv_data *osi_core)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* * XLGPCS programming guideline IAS section 7.1.3.2.2.2
|
/* * XLGPCS programming guideline IAS section 7.1.3.2.2.2
|
||||||
*/
|
*/
|
||||||
/* 4 Poll SR_PCS_CTRL1 reg RST bit */
|
if (osi_core->pcs_base_r_fec_en != OSI_ENABLE) {
|
||||||
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
|
/* 4 Poll SR_PCS_CTRL1 reg RST bit */
|
||||||
ctrl |= XLGPCS_SR_PCS_CTRL1_RST;
|
|
||||||
xpcs_write(xpcs_base, XLGPCS_SR_PCS_CTRL1, ctrl);
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
while (cond == 1) {
|
|
||||||
if (count > retry) {
|
|
||||||
ret = -1;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
|
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
|
||||||
if ((ctrl & XLGPCS_SR_PCS_CTRL1_RST) == 0U) {
|
ctrl |= XLGPCS_SR_PCS_CTRL1_RST;
|
||||||
cond = 0;
|
xpcs_write(xpcs_base, XLGPCS_SR_PCS_CTRL1, ctrl);
|
||||||
} else {
|
|
||||||
/* Maximum wait delay as per HW team is 10msec.
|
count = 0;
|
||||||
* So add a loop for 1000 iterations with 1usec delay,
|
while (cond == 1) {
|
||||||
* so that if check get satisfies before 1msec will come
|
if (count > retry) {
|
||||||
* out of loop and it can save some boot time
|
ret = -1;
|
||||||
*/
|
goto fail;
|
||||||
osi_core->osd_ops.udelay(10U);
|
}
|
||||||
|
count++;
|
||||||
|
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
|
||||||
|
if ((ctrl & XLGPCS_SR_PCS_CTRL1_RST) == 0U) {
|
||||||
|
cond = 0;
|
||||||
|
} else {
|
||||||
|
/* Maximum wait delay as per HW team is 10msec.
|
||||||
|
* So add a loop for 1000 iterations with 1usec delay,
|
||||||
|
* so that if check get satisfies before 1msec will come
|
||||||
|
* out of loop and it can save some boot time
|
||||||
|
*/
|
||||||
|
osi_core->osd_ops.udelay(10U);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 5 Program SR_AN_CTRL reg AN_EN bit to disable auto-neg */
|
/* 5 Program SR_AN_CTRL reg AN_EN bit to disable auto-neg */
|
||||||
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_AN_CTRL);
|
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_AN_CTRL);
|
||||||
ctrl &= ~XLGPCS_SR_AN_CTRL_AN_EN;
|
ctrl &= ~XLGPCS_SR_AN_CTRL_AN_EN;
|
||||||
@@ -856,6 +860,21 @@ static nve32_t xpcs_base_r_fec(struct osi_core_priv_data *osi_core)
|
|||||||
nveu32_t ctrl = 0;
|
nveu32_t ctrl = 0;
|
||||||
nve32_t ret = 0;
|
nve32_t ret = 0;
|
||||||
|
|
||||||
|
if ((osi_core->pcs_base_r_fec_en == OSI_ENABLE) &&
|
||||||
|
(osi_core->uphy_gbe_mode == OSI_GBE_MODE_25G)) {
|
||||||
|
/* Program SR_AN_CTRL reg AN_EN bit to disable auto-neg */
|
||||||
|
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_AN_CTRL);
|
||||||
|
ctrl &= ~XLGPCS_SR_AN_CTRL_AN_EN;
|
||||||
|
ret = xpcs_write_safety(osi_core, XLGPCS_SR_AN_CTRL, ctrl);
|
||||||
|
if (ret != 0) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
osi_writela(osi_core, XPCS_WRAP_UPHY_TIMEOUT_CONTROL_0_0_VALUE,
|
||||||
|
(nveu8_t *)osi_core->xpcs_base +
|
||||||
|
T26X_XPCS_WRAP_UPHY_TIMEOUT_CONTROL_0_0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Enable/Disable BASE-R FEC */
|
/* Enable/Disable BASE-R FEC */
|
||||||
ctrl = xpcs_read(xpcs_base, XPCS_SR_PMA_KR_FEC_CTRL);
|
ctrl = xpcs_read(xpcs_base, XPCS_SR_PMA_KR_FEC_CTRL);
|
||||||
if (osi_core->pcs_base_r_fec_en == OSI_ENABLE) {
|
if (osi_core->pcs_base_r_fec_en == OSI_ENABLE) {
|
||||||
@@ -869,7 +888,7 @@ static nve32_t xpcs_base_r_fec(struct osi_core_priv_data *osi_core)
|
|||||||
ret = xpcs_write_safety(osi_core, XPCS_SR_PMA_KR_FEC_CTRL, ctrl);
|
ret = xpcs_write_safety(osi_core, XPCS_SR_PMA_KR_FEC_CTRL, ctrl);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
#define T26X_XPCS_WRAP_UPHY_TX_CTRL_2 0x8008
|
#define T26X_XPCS_WRAP_UPHY_TX_CTRL_2 0x8008
|
||||||
#define T26X_XPCS_WRAP_UPHY_RX_CTRL_2 0x8040
|
#define T26X_XPCS_WRAP_UPHY_RX_CTRL_2 0x8040
|
||||||
#define T26X_XPCS_WRAP_UPHY_RX_CTRL_3 0x8044
|
#define T26X_XPCS_WRAP_UPHY_RX_CTRL_3 0x8044
|
||||||
|
#define T26X_XPCS_WRAP_UPHY_TIMEOUT_CONTROL_0_0 0x8070
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
@@ -134,6 +134,7 @@
|
|||||||
#define XPCS_10G_WRAP_UPHY_RX_CTRL_2_SLEEP_CAL_EN_DLY 0xCAAU
|
#define XPCS_10G_WRAP_UPHY_RX_CTRL_2_SLEEP_CAL_EN_DLY 0xCAAU
|
||||||
#define XPCS_10G_WRAP_UPHY_TX_CTRL_3_DATAREADY_DATAEN_DLY 0x50U
|
#define XPCS_10G_WRAP_UPHY_TX_CTRL_3_DATAREADY_DATAEN_DLY 0x50U
|
||||||
#define XPCS_10G_WRAP_UPHY_RX_CTRL_3_CAL_DONE_DATA_EN_DLY 0x32U
|
#define XPCS_10G_WRAP_UPHY_RX_CTRL_3_CAL_DONE_DATA_EN_DLY 0x32U
|
||||||
|
#define XPCS_WRAP_UPHY_TIMEOUT_CONTROL_0_0_VALUE 0x3FFFD90
|
||||||
|
|
||||||
#define EQOS_XPCS_WRAP_UPHY_HW_INIT_CTRL 0x8038
|
#define EQOS_XPCS_WRAP_UPHY_HW_INIT_CTRL 0x8038
|
||||||
#define EQOS_XPCS_WRAP_UPHY_STATUS 0x8064
|
#define EQOS_XPCS_WRAP_UPHY_STATUS 0x8064
|
||||||
|
|||||||
Reference in New Issue
Block a user