Skip to content

Commit bd45f64

Browse files
Russell Kingdavem330
authored andcommitted
net: mvpp2: add register modification helper
Add a helper to read-modify-write a register, and use it in the phylink helpers. Signed-off-by: Russell King <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6c2b49e commit bd45f64

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11351146
static 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)
49464957
static 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

49834985
static 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

Comments
 (0)