|
66 | 66 | /* Forward declarations */ |
67 | 67 | static void bcmgenet_set_rx_mode(struct net_device *dev); |
68 | 68 |
|
| 69 | +/* |
| 70 | + * Diagnostic knob for isolating GENET EEE/LPI failures. |
| 71 | + * |
| 72 | + * Bit 0: UMAC EEE protocol handling |
| 73 | + * Bit 1: TBUF EEE/power-management |
| 74 | + * Bit 2: RBUF EEE/power-management |
| 75 | + * |
| 76 | + */ |
| 77 | +#define GENET_EEE_PM_UMAC BIT(0) |
| 78 | +#define GENET_EEE_PM_TBUF BIT(1) |
| 79 | +#define GENET_EEE_PM_RBUF BIT(2) |
| 80 | +#define GENET_EEE_PM_ALL (GENET_EEE_PM_UMAC | \ |
| 81 | + GENET_EEE_PM_TBUF | \ |
| 82 | + GENET_EEE_PM_RBUF) |
| 83 | + |
| 84 | +static uint eee_pm_mask = GENET_EEE_PM_ALL; |
| 85 | +module_param(eee_pm_mask, uint, 0444); |
| 86 | +MODULE_PARM_DESC(eee_pm_mask, |
| 87 | + "EEE power-management mask: bit0=UMAC bit1=TBUF bit2=RBUF"); |
| 88 | + |
69 | 89 | static inline void bcmgenet_writel(u32 value, void __iomem *offset) |
70 | 90 | { |
71 | 91 | /* MIPS chips strapped for BE will automagically configure the |
@@ -1347,37 +1367,40 @@ void bcmgenet_eee_enable_set(struct net_device *dev, bool enable) |
1347 | 1367 | { |
1348 | 1368 | struct bcmgenet_priv *priv = netdev_priv(dev); |
1349 | 1369 | u32 off = priv->hw_params->tbuf_offset + TBUF_ENERGY_CTRL; |
| 1370 | + u32 mask = enable ? eee_pm_mask : 0; |
1350 | 1371 | u32 reg; |
1351 | 1372 |
|
1352 | | - if (enable && !priv->clk_eee_enabled) { |
| 1373 | + netdev_info_once(dev, "GENET EEE PM mask: 0x%x\n", eee_pm_mask); |
| 1374 | + |
| 1375 | + if (mask && !priv->clk_eee_enabled) { |
1353 | 1376 | clk_prepare_enable(priv->clk_eee); |
1354 | 1377 | priv->clk_eee_enabled = true; |
1355 | 1378 | } |
1356 | 1379 |
|
1357 | 1380 | reg = bcmgenet_umac_readl(priv, UMAC_EEE_CTRL); |
1358 | | - if (enable) |
| 1381 | + if (mask & GENET_EEE_PM_UMAC) |
1359 | 1382 | reg |= EEE_EN; |
1360 | 1383 | else |
1361 | 1384 | reg &= ~EEE_EN; |
1362 | 1385 | bcmgenet_umac_writel(priv, reg, UMAC_EEE_CTRL); |
1363 | 1386 |
|
1364 | 1387 | /* Enable EEE and switch to a 27Mhz clock automatically */ |
1365 | 1388 | reg = bcmgenet_readl(priv->base + off); |
1366 | | - if (enable) |
| 1389 | + if (mask & GENET_EEE_PM_TBUF) |
1367 | 1390 | reg |= TBUF_EEE_EN | TBUF_PM_EN; |
1368 | 1391 | else |
1369 | 1392 | reg &= ~(TBUF_EEE_EN | TBUF_PM_EN); |
1370 | 1393 | bcmgenet_writel(reg, priv->base + off); |
1371 | 1394 |
|
1372 | 1395 | /* Do the same for thing for RBUF */ |
1373 | 1396 | reg = bcmgenet_rbuf_readl(priv, RBUF_ENERGY_CTRL); |
1374 | | - if (enable) |
| 1397 | + if (mask & GENET_EEE_PM_RBUF) |
1375 | 1398 | reg |= RBUF_EEE_EN | RBUF_PM_EN; |
1376 | 1399 | else |
1377 | 1400 | reg &= ~(RBUF_EEE_EN | RBUF_PM_EN); |
1378 | 1401 | bcmgenet_rbuf_writel(priv, reg, RBUF_ENERGY_CTRL); |
1379 | 1402 |
|
1380 | | - if (!enable && priv->clk_eee_enabled) { |
| 1403 | + if (!mask && priv->clk_eee_enabled) { |
1381 | 1404 | clk_disable_unprepare(priv->clk_eee); |
1382 | 1405 | priv->clk_eee_enabled = false; |
1383 | 1406 | } |
|
0 commit comments