@@ -1132,6 +1132,17 @@ static bool mvpp2_is_xlg(phy_interface_t interface)
11321132 interface == PHY_INTERFACE_MODE_XAUI ;
11331133}
11341134
1135+ static void mvpp2_modify (void __iomem * ptr , u32 mask , u32 set )
1136+ {
1137+ u32 old , val ;
1138+
1139+ old = val = readl (ptr );
1140+ val &= ~mask ;
1141+ val |= set ;
1142+ if (old != val )
1143+ writel (val , ptr );
1144+ }
1145+
11351146static void mvpp22_gop_init_rgmii (struct mvpp2_port * port )
11361147{
11371148 struct mvpp2 * priv = port -> priv ;
@@ -4946,38 +4957,29 @@ static void mvpp2_mac_an_restart(struct phylink_config *config)
49464957static void mvpp2_xlg_config (struct mvpp2_port * port , unsigned int mode ,
49474958 const struct phylink_link_state * state )
49484959{
4949- u32 old_ctrl0 , ctrl0 ;
4950- u32 old_ctrl4 , ctrl4 ;
4951-
4952- old_ctrl0 = ctrl0 = readl (port -> base + MVPP22_XLG_CTRL0_REG );
4953- old_ctrl4 = ctrl4 = readl (port -> base + MVPP22_XLG_CTRL4_REG );
4954-
4955- ctrl0 |= MVPP22_XLG_CTRL0_MAC_RESET_DIS ;
4960+ u32 val ;
49564961
4962+ val = MVPP22_XLG_CTRL0_MAC_RESET_DIS ;
49574963 if (state -> pause & MLO_PAUSE_TX )
4958- ctrl0 |= MVPP22_XLG_CTRL0_TX_FLOW_CTRL_EN ;
4959- else
4960- ctrl0 &= ~MVPP22_XLG_CTRL0_TX_FLOW_CTRL_EN ;
4964+ val |= MVPP22_XLG_CTRL0_TX_FLOW_CTRL_EN ;
49614965
49624966 if (state -> pause & MLO_PAUSE_RX )
4963- ctrl0 |= MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN ;
4964- else
4965- ctrl0 &= ~MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN ;
4966-
4967- ctrl4 &= ~(MVPP22_XLG_CTRL4_MACMODSELECT_GMAC |
4968- MVPP22_XLG_CTRL4_EN_IDLE_CHECK );
4969- ctrl4 |= MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC ;
4970-
4971- if (old_ctrl0 != ctrl0 )
4972- writel (ctrl0 , port -> base + MVPP22_XLG_CTRL0_REG );
4973- if (old_ctrl4 != ctrl4 )
4974- writel (ctrl4 , port -> base + MVPP22_XLG_CTRL4_REG );
4975-
4976- if (!(old_ctrl0 & MVPP22_XLG_CTRL0_MAC_RESET_DIS )) {
4977- while (!(readl (port -> base + MVPP22_XLG_CTRL0_REG ) &
4978- MVPP22_XLG_CTRL0_MAC_RESET_DIS ))
4979- continue ;
4980- }
4967+ val |= MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN ;
4968+
4969+ mvpp2_modify (port -> base + MVPP22_XLG_CTRL0_REG ,
4970+ MVPP22_XLG_CTRL0_MAC_RESET_DIS |
4971+ MVPP22_XLG_CTRL0_TX_FLOW_CTRL_EN |
4972+ MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN , val );
4973+ mvpp2_modify (port -> base + MVPP22_XLG_CTRL4_REG ,
4974+ MVPP22_XLG_CTRL4_MACMODSELECT_GMAC |
4975+ MVPP22_XLG_CTRL4_EN_IDLE_CHECK |
4976+ MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC ,
4977+ MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC );
4978+
4979+ /* Wait for reset to deassert */
4980+ do {
4981+ val = readl (port -> base + MVPP22_XLG_CTRL0_REG );
4982+ } while (!(val & MVPP22_XLG_CTRL0_MAC_RESET_DIS ));
49814983}
49824984
49834985static void mvpp2_gmac_config (struct mvpp2_port * port , unsigned int mode ,
@@ -5157,19 +5159,14 @@ static void mvpp2_mac_link_up(struct phylink_config *config,
51575159
51585160 if (mvpp2_is_xlg (interface )) {
51595161 if (!phylink_autoneg_inband (mode )) {
5160- val = readl (port -> base + MVPP22_XLG_CTRL0_REG );
5161- val &= ~ MVPP22_XLG_CTRL0_FORCE_LINK_DOWN ;
5162- val |= MVPP22_XLG_CTRL0_FORCE_LINK_PASS ;
5163- writel ( val , port -> base + MVPP22_XLG_CTRL0_REG );
5162+ mvpp2_modify (port -> base + MVPP22_XLG_CTRL0_REG ,
5163+ MVPP22_XLG_CTRL0_FORCE_LINK_DOWN |
5164+ MVPP22_XLG_CTRL0_FORCE_LINK_PASS ,
5165+ MVPP22_XLG_CTRL0_FORCE_LINK_PASS );
51645166 }
51655167 } else {
51665168 if (!phylink_autoneg_inband (mode )) {
5167- val = readl (port -> base + MVPP2_GMAC_AUTONEG_CONFIG );
5168- val &= ~(MVPP2_GMAC_FORCE_LINK_DOWN |
5169- MVPP2_GMAC_CONFIG_MII_SPEED |
5170- MVPP2_GMAC_CONFIG_GMII_SPEED |
5171- MVPP2_GMAC_CONFIG_FULL_DUPLEX );
5172- val |= MVPP2_GMAC_FORCE_LINK_PASS ;
5169+ val = MVPP2_GMAC_FORCE_LINK_PASS ;
51735170
51745171 if (speed == SPEED_1000 || speed == SPEED_2500 )
51755172 val |= MVPP2_GMAC_CONFIG_GMII_SPEED ;
@@ -5179,20 +5176,27 @@ static void mvpp2_mac_link_up(struct phylink_config *config,
51795176 if (duplex == DUPLEX_FULL )
51805177 val |= MVPP2_GMAC_CONFIG_FULL_DUPLEX ;
51815178
5182- writel (val , port -> base + MVPP2_GMAC_AUTONEG_CONFIG );
5179+ mvpp2_modify (port -> base + MVPP2_GMAC_AUTONEG_CONFIG ,
5180+ MVPP2_GMAC_FORCE_LINK_DOWN |
5181+ MVPP2_GMAC_FORCE_LINK_PASS |
5182+ MVPP2_GMAC_CONFIG_MII_SPEED |
5183+ MVPP2_GMAC_CONFIG_GMII_SPEED |
5184+ MVPP2_GMAC_CONFIG_FULL_DUPLEX , val );
51835185 }
51845186
51855187 /* We can always update the flow control enable bits;
51865188 * these will only be effective if flow control AN
51875189 * (MVPP2_GMAC_FLOW_CTRL_AUTONEG) is disabled.
51885190 */
5189- val = readl (port -> base + MVPP22_GMAC_CTRL_4_REG );
5190- val &= ~(MVPP22_CTRL4_RX_FC_EN | MVPP22_CTRL4_TX_FC_EN );
5191+ val = 0 ;
51915192 if (tx_pause )
51925193 val |= MVPP22_CTRL4_TX_FC_EN ;
51935194 if (rx_pause )
51945195 val |= MVPP22_CTRL4_RX_FC_EN ;
5195- writel (val , port -> base + MVPP22_GMAC_CTRL_4_REG );
5196+
5197+ mvpp2_modify (port -> base + MVPP22_GMAC_CTRL_4_REG ,
5198+ MVPP22_CTRL4_RX_FC_EN | MVPP22_CTRL4_TX_FC_EN ,
5199+ val );
51965200 }
51975201
51985202 mvpp2_port_enable (port );
0 commit comments