Commit d26e444d authored by Tomasz Wlostowski's avatar Tomasz Wlostowski Committed by Adam Wujek

wrsw: more robust link detection for PHY calibration

parent 5bebb4e2
......@@ -200,6 +200,7 @@ struct hal_port_tx_setup_state
struct hal_port_rx_setup_state
{
timeout_t link_timeout;
int state;
int attempts;
};
......@@ -486,6 +487,8 @@ static int rx_fsm_update(struct hal_port_state *p)
struct hal_port_rx_setup_state *fsm = p->rx_setup_fsm;
struct hal_port_tx_setup_state *fsm_tx = p->tx_setup_fsm;
int early_link_up = pcs_readl(p, MDIO_DBG0) & MDIO_DBG0_LINK_UP;
if (fsm_tx->state != TX_SETUP_DONE) {
fsm->state = RX_SETUP_STATE_INIT;
return 0;
......@@ -496,9 +499,9 @@ static int rx_fsm_update(struct hal_port_state *p)
{
pcs_writel(p, MDIO_DBG1_TX_ENABLE | MDIO_DBG1_DMTD_SOURCE_RXRECCLK, MDIO_DBG1);
if (pcs_readl(p, MDIO_DBG0) & MDIO_DBG0_LINK_UP) {
if (fsm_tx->state == TX_SETUP_DONE) {
printf("Rx-cal: calibrating port %d.\n", p->hw_index + 1);
if (early_link_up) {
if (fsm_tx->state == TX_SETUP_DONE) {
pr_debug("Rx-cal: calibrating port %d.\n", p->hw_index + 1);
fsm->state = RX_SETUP_STATE_RESET_PCS;
rts_enable_ptracker(p->hw_index, 0);
......@@ -512,20 +515,17 @@ static int rx_fsm_update(struct hal_port_state *p)
case RX_SETUP_STATE_RESET_PCS:
{
//printf("REset PCS\n");
if (pcs_readl(p, MDIO_DBG0) & MDIO_DBG0_LINK_UP) {
if (early_link_up) {
fsm->state = RX_SETUP_STATE_WAIT_LOCK;
libwr_tmo_init(&fsm->link_timeout, 100, 1);
pcs_writel(p, MDIO_DBG1_RESET_RX | MDIO_DBG1_TX_ENABLE | MDIO_DBG1_DMTD_SOURCE_RXRECCLK, MDIO_DBG1);
shw_udelay(1);
pcs_writel(p, MDIO_DBG1_TX_ENABLE | MDIO_DBG1_DMTD_SOURCE_RXRECCLK, MDIO_DBG1);
fsm->attempts++;
shw_udelay(1000);
//usleep(100000);
} else {
fsm->state = RX_SETUP_STATE_INIT;
}
break;
......@@ -534,13 +534,13 @@ static int rx_fsm_update(struct hal_port_state *p)
case RX_SETUP_STATE_WAIT_LOCK:
{
uint16_t dbg0 = pcs_readl(p, MDIO_DBG0);
// if( dbg0 & MDIO_DBG0_RESET_RX_DONE )
{
int rx_up = dbg0 & MDIO_DBG0_LINK_UP;
int rx_aligned = dbg0 & MDIO_DBG0_LINK_ALIGNED;
// printf("up %d aligned %d\n", rx_up ? 1: 0, rx_aligned ? 1: 0);
int rx_up = dbg0 & MDIO_DBG0_LINK_UP;
int rx_aligned = dbg0 & MDIO_DBG0_LINK_ALIGNED;
if (libwr_tmo_expired(&fsm->link_timeout) && !rx_up) {
fsm->state = RX_SETUP_STATE_INIT;
} else {
if (!rx_up)
return 0;
......@@ -548,7 +548,6 @@ static int rx_fsm_update(struct hal_port_state *p)
rts_enable_ptracker(p->hw_index, 0);
rts_enable_ptracker(p->hw_index, 1);
tx_fsm_pll_state.channels[p->hw_index].flags = 0;
fsm->state = RX_SETUP_VALIDATE;
} else {
fsm->state = RX_SETUP_STATE_RESET_PCS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment