Skip to content

Commit 2697582

Browse files
tpetazzonidavem330
authored andcommitted
net: mvpp2: handle misc PPv2.1/PPv2.2 differences
This commit handles a few miscellaneous differences between PPv2.1 and PPv2.2 in different areas, where code done for PPv2.1 doesn't apply for PPv2.2 or needs to be adjusted (getting the MAC address, disabling PHY polling, etc.). Thanks to Russell King for providing the initial implementation of mvpp22_port_mii_set(). Signed-off-by: Thomas Petazzoni <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a786841 commit 2697582

File tree

1 file changed

+67
-18
lines changed
  • drivers/net/ethernet/marvell

1 file changed

+67
-18
lines changed

drivers/net/ethernet/marvell/mvpp2.c

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,22 @@
294294
#define MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK 0x1fc0
295295
#define MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(v) (((v) << 6) & \
296296
MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK)
297+
#define MVPP22_GMAC_CTRL_4_REG 0x90
298+
#define MVPP22_CTRL4_EXT_PIN_GMII_SEL BIT(0)
299+
#define MVPP22_CTRL4_DP_CLK_SEL BIT(5)
300+
#define MVPP22_CTRL4_SYNC_BYPASS BIT(6)
301+
#define MVPP22_CTRL4_QSGMII_BYPASS_ACTIVE BIT(7)
302+
303+
/* Per-port XGMAC registers. PPv2.2 only, only for GOP port 0,
304+
* relative to port->base.
305+
*/
306+
#define MVPP22_XLG_CTRL3_REG 0x11c
307+
#define MVPP22_XLG_CTRL3_MACMODESELECT_MASK (7 << 13)
308+
#define MVPP22_XLG_CTRL3_MACMODESELECT_GMAC (0 << 13)
309+
310+
/* SMI registers. PPv2.2 only, relative to priv->iface_base. */
311+
#define MVPP22_SMI_MISC_CFG_REG 0x1204
312+
#define MVPP22_SMI_POLLING_EN BIT(10)
297313

298314
#define MVPP22_GMAC_BASE(port) (0x7000 + (port) * 0x1000 + 0xe00)
299315

@@ -4128,10 +4144,38 @@ static void mvpp2_interrupts_unmask(void *arg)
41284144

41294145
/* Port configuration routines */
41304146

4147+
static void mvpp22_port_mii_set(struct mvpp2_port *port)
4148+
{
4149+
u32 val;
4150+
4151+
return;
4152+
4153+
/* Only GOP port 0 has an XLG MAC */
4154+
if (port->gop_id == 0) {
4155+
val = readl(port->base + MVPP22_XLG_CTRL3_REG);
4156+
val &= ~MVPP22_XLG_CTRL3_MACMODESELECT_MASK;
4157+
val |= MVPP22_XLG_CTRL3_MACMODESELECT_GMAC;
4158+
writel(val, port->base + MVPP22_XLG_CTRL3_REG);
4159+
}
4160+
4161+
val = readl(port->base + MVPP22_GMAC_CTRL_4_REG);
4162+
if (port->phy_interface == PHY_INTERFACE_MODE_RGMII)
4163+
val |= MVPP22_CTRL4_EXT_PIN_GMII_SEL;
4164+
else
4165+
val &= ~MVPP22_CTRL4_EXT_PIN_GMII_SEL;
4166+
val &= ~MVPP22_CTRL4_DP_CLK_SEL;
4167+
val |= MVPP22_CTRL4_SYNC_BYPASS;
4168+
val |= MVPP22_CTRL4_QSGMII_BYPASS_ACTIVE;
4169+
writel(val, port->base + MVPP22_GMAC_CTRL_4_REG);
4170+
}
4171+
41314172
static void mvpp2_port_mii_set(struct mvpp2_port *port)
41324173
{
41334174
u32 val;
41344175

4176+
if (port->priv->hw_version == MVPP22)
4177+
mvpp22_port_mii_set(port);
4178+
41354179
val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
41364180

41374181
switch (port->phy_interface) {
@@ -5813,7 +5857,7 @@ static int mvpp2_check_ringparam_valid(struct net_device *dev,
58135857
return 0;
58145858
}
58155859

5816-
static void mvpp2_get_mac_address(struct mvpp2_port *port, unsigned char *addr)
5860+
static void mvpp21_get_mac_address(struct mvpp2_port *port, unsigned char *addr)
58175861
{
58185862
u32 mac_addr_l, mac_addr_m, mac_addr_h;
58195863

@@ -6258,16 +6302,6 @@ static const struct ethtool_ops mvpp2_eth_tool_ops = {
62586302
.set_link_ksettings = phy_ethtool_set_link_ksettings,
62596303
};
62606304

6261-
/* Driver initialization */
6262-
6263-
static void mvpp2_port_power_up(struct mvpp2_port *port)
6264-
{
6265-
mvpp2_port_mii_set(port);
6266-
mvpp2_port_periodic_xon_disable(port);
6267-
mvpp2_port_fc_adv_enable(port);
6268-
mvpp2_port_reset(port);
6269-
}
6270-
62716305
/* Initialize port HW */
62726306
static int mvpp2_port_init(struct mvpp2_port *port)
62736307
{
@@ -6479,7 +6513,8 @@ static int mvpp2_port_probe(struct platform_device *pdev,
64796513
mac_from = "device tree";
64806514
ether_addr_copy(dev->dev_addr, dt_mac_addr);
64816515
} else {
6482-
mvpp2_get_mac_address(port, hw_mac_addr);
6516+
if (priv->hw_version == MVPP21)
6517+
mvpp21_get_mac_address(port, hw_mac_addr);
64836518
if (is_valid_ether_addr(hw_mac_addr)) {
64846519
mac_from = "hardware";
64856520
ether_addr_copy(dev->dev_addr, hw_mac_addr);
@@ -6499,7 +6534,14 @@ static int mvpp2_port_probe(struct platform_device *pdev,
64996534
dev_err(&pdev->dev, "failed to init port %d\n", id);
65006535
goto err_free_stats;
65016536
}
6502-
mvpp2_port_power_up(port);
6537+
6538+
mvpp2_port_mii_set(port);
6539+
mvpp2_port_periodic_xon_disable(port);
6540+
6541+
if (priv->hw_version == MVPP21)
6542+
mvpp2_port_fc_adv_enable(port);
6543+
6544+
mvpp2_port_reset(port);
65036545

65046546
port->pcpu = alloc_percpu(struct mvpp2_port_pcpu);
65056547
if (!port->pcpu) {
@@ -6642,9 +6684,15 @@ static int mvpp2_init(struct platform_device *pdev, struct mvpp2 *priv)
66426684
mvpp2_conf_mbus_windows(dram_target_info, priv);
66436685

66446686
/* Disable HW PHY polling */
6645-
val = readl(priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
6646-
val |= MVPP2_PHY_AN_STOP_SMI0_MASK;
6647-
writel(val, priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
6687+
if (priv->hw_version == MVPP21) {
6688+
val = readl(priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
6689+
val |= MVPP2_PHY_AN_STOP_SMI0_MASK;
6690+
writel(val, priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
6691+
} else {
6692+
val = readl(priv->iface_base + MVPP22_SMI_MISC_CFG_REG);
6693+
val &= ~MVPP22_SMI_POLLING_EN;
6694+
writel(val, priv->iface_base + MVPP22_SMI_MISC_CFG_REG);
6695+
}
66486696

66496697
/* Allocate and initialize aggregated TXQs */
66506698
priv->aggr_txqs = devm_kcalloc(&pdev->dev, num_present_cpus(),
@@ -6669,8 +6717,9 @@ static int mvpp2_init(struct platform_device *pdev, struct mvpp2 *priv)
66696717
for (i = 0; i < MVPP2_MAX_PORTS; i++)
66706718
mvpp2_write(priv, MVPP2_ISR_RXQ_GROUP_REG(i), rxq_number);
66716719

6672-
writel(MVPP2_EXT_GLOBAL_CTRL_DEFAULT,
6673-
priv->lms_base + MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG);
6720+
if (priv->hw_version == MVPP21)
6721+
writel(MVPP2_EXT_GLOBAL_CTRL_DEFAULT,
6722+
priv->lms_base + MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG);
66746723

66756724
/* Allow cache snoop when transmiting packets */
66766725
mvpp2_write(priv, MVPP2_TX_SNOOP_REG, 0x1);

0 commit comments

Comments
 (0)