aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-02-15 13:20:57 -0500
committerDavid S. Miller <davem@davemloft.net>2017-02-15 13:20:57 -0500
commit6a553b4894264eb880fe07c2ac6be54eea1d7abb (patch)
treeca6d1690943b85df1dbdb4bcd5d770b67d666df8
parent36a4a50f4048f21b7c2694b37804dfc1d9890ab4 (diff)
parentc80151ec4b65c08dac6a653a849ec5e50d94708f (diff)
Merge branch 'stmmac-misc'
Corentin Labbe says: ==================== stmmac: misc patchs This is a follow up of my previous stmmac serie which address some comment done in v2. ==================== Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c18
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_main.c40
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c82
3 files changed, 71 insertions, 69 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index aab895d9257e..5ff6bc4eb8f1 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -442,24 +442,24 @@ static void stmmac_ethtool_gregs(struct net_device *dev,
442 442
443 memset(reg_space, 0x0, REG_SPACE_SIZE); 443 memset(reg_space, 0x0, REG_SPACE_SIZE);
444 444
445 if (!(priv->plat->has_gmac || priv->plat->has_gmac4)) { 445 if (priv->plat->has_gmac || priv->plat->has_gmac4) {
446 /* MAC registers */ 446 /* MAC registers */
447 for (i = 0; i < 12; i++) 447 for (i = 0; i < 55; i++)
448 reg_space[i] = readl(priv->ioaddr + (i * 4)); 448 reg_space[i] = readl(priv->ioaddr + (i * 4));
449 /* DMA registers */ 449 /* DMA registers */
450 for (i = 0; i < 9; i++) 450 for (i = 0; i < 22; i++)
451 reg_space[i + 12] = 451 reg_space[i + 55] =
452 readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4))); 452 readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
453 reg_space[22] = readl(priv->ioaddr + DMA_CUR_TX_BUF_ADDR);
454 reg_space[23] = readl(priv->ioaddr + DMA_CUR_RX_BUF_ADDR);
455 } else { 453 } else {
456 /* MAC registers */ 454 /* MAC registers */
457 for (i = 0; i < 55; i++) 455 for (i = 0; i < 12; i++)
458 reg_space[i] = readl(priv->ioaddr + (i * 4)); 456 reg_space[i] = readl(priv->ioaddr + (i * 4));
459 /* DMA registers */ 457 /* DMA registers */
460 for (i = 0; i < 22; i++) 458 for (i = 0; i < 9; i++)
461 reg_space[i + 55] = 459 reg_space[i + 12] =
462 readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4))); 460 readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
461 reg_space[22] = readl(priv->ioaddr + DMA_CUR_TX_BUF_ADDR);
462 reg_space[23] = readl(priv->ioaddr + DMA_CUR_RX_BUF_ADDR);
463 } 463 }
464} 464}
465 465
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 7251871eaa32..3cbe09682afe 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -716,32 +716,36 @@ static void stmmac_adjust_link(struct net_device *dev)
716 new_state = 1; 716 new_state = 1;
717 switch (phydev->speed) { 717 switch (phydev->speed) {
718 case 1000: 718 case 1000:
719 if (likely((priv->plat->has_gmac) || 719 if (priv->plat->has_gmac ||
720 (priv->plat->has_gmac4))) 720 priv->plat->has_gmac4)
721 ctrl &= ~priv->hw->link.port; 721 ctrl &= ~priv->hw->link.port;
722 stmmac_hw_fix_mac_speed(priv);
723 break; 722 break;
724 case 100: 723 case 100:
724 if (priv->plat->has_gmac ||
725 priv->plat->has_gmac4) {
726 ctrl |= priv->hw->link.port;
727 ctrl |= priv->hw->link.speed;
728 } else {
729 ctrl &= ~priv->hw->link.port;
730 }
731 break;
725 case 10: 732 case 10:
726 if (likely((priv->plat->has_gmac) || 733 if (priv->plat->has_gmac ||
727 (priv->plat->has_gmac4))) { 734 priv->plat->has_gmac4) {
728 ctrl |= priv->hw->link.port; 735 ctrl |= priv->hw->link.port;
729 if (phydev->speed == SPEED_100) { 736 ctrl &= ~(priv->hw->link.speed);
730 ctrl |= priv->hw->link.speed;
731 } else {
732 ctrl &= ~(priv->hw->link.speed);
733 }
734 } else { 737 } else {
735 ctrl &= ~priv->hw->link.port; 738 ctrl &= ~priv->hw->link.port;
736 } 739 }
737 stmmac_hw_fix_mac_speed(priv);
738 break; 740 break;
739 default: 741 default:
740 netif_warn(priv, link, priv->dev, 742 netif_warn(priv, link, priv->dev,
741 "broken speed: %d\n", phydev->speed); 743 "broken speed: %d\n", phydev->speed);
744 phydev->speed = SPEED_UNKNOWN;
742 break; 745 break;
743 } 746 }
744 747 if (phydev->speed != SPEED_UNKNOWN)
748 stmmac_hw_fix_mac_speed(priv);
745 priv->speed = phydev->speed; 749 priv->speed = phydev->speed;
746 } 750 }
747 751
@@ -754,8 +758,8 @@ static void stmmac_adjust_link(struct net_device *dev)
754 } else if (priv->oldlink) { 758 } else if (priv->oldlink) {
755 new_state = 1; 759 new_state = 1;
756 priv->oldlink = 0; 760 priv->oldlink = 0;
757 priv->speed = 0; 761 priv->speed = SPEED_UNKNOWN;
758 priv->oldduplex = -1; 762 priv->oldduplex = DUPLEX_UNKNOWN;
759 } 763 }
760 764
761 if (new_state && netif_msg_link(priv)) 765 if (new_state && netif_msg_link(priv))
@@ -817,8 +821,8 @@ static int stmmac_init_phy(struct net_device *dev)
817 int interface = priv->plat->interface; 821 int interface = priv->plat->interface;
818 int max_speed = priv->plat->max_speed; 822 int max_speed = priv->plat->max_speed;
819 priv->oldlink = 0; 823 priv->oldlink = 0;
820 priv->speed = 0; 824 priv->speed = SPEED_UNKNOWN;
821 priv->oldduplex = -1; 825 priv->oldduplex = DUPLEX_UNKNOWN;
822 826
823 if (priv->plat->phy_node) { 827 if (priv->plat->phy_node) {
824 phydev = of_phy_connect(dev, priv->plat->phy_node, 828 phydev = of_phy_connect(dev, priv->plat->phy_node,
@@ -3434,8 +3438,8 @@ int stmmac_suspend(struct device *dev)
3434 spin_unlock_irqrestore(&priv->lock, flags); 3438 spin_unlock_irqrestore(&priv->lock, flags);
3435 3439
3436 priv->oldlink = 0; 3440 priv->oldlink = 0;
3437 priv->speed = 0; 3441 priv->speed = SPEED_UNKNOWN;
3438 priv->oldduplex = -1; 3442 priv->oldduplex = DUPLEX_UNKNOWN;
3439 return 0; 3443 return 0;
3440} 3444}
3441EXPORT_SYMBOL_GPL(stmmac_suspend); 3445EXPORT_SYMBOL_GPL(stmmac_suspend);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
index d9893cf05695..db157a47000c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
@@ -247,50 +247,48 @@ int stmmac_mdio_register(struct net_device *ndev)
247 found = 0; 247 found = 0;
248 for (addr = 0; addr < PHY_MAX_ADDR; addr++) { 248 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
249 struct phy_device *phydev = mdiobus_get_phy(new_bus, addr); 249 struct phy_device *phydev = mdiobus_get_phy(new_bus, addr);
250 int act = 0;
251 char irq_num[4];
252 char *irq_str;
253
254 if (!phydev)
255 continue;
256
257 /*
258 * If an IRQ was provided to be assigned after
259 * the bus probe, do it here.
260 */
261 if (!mdio_bus_data->irqs &&
262 (mdio_bus_data->probed_phy_irq > 0)) {
263 new_bus->irq[addr] = mdio_bus_data->probed_phy_irq;
264 phydev->irq = mdio_bus_data->probed_phy_irq;
265 }
250 266
251 if (phydev) { 267 /*
252 int act = 0; 268 * If we're going to bind the MAC to this PHY bus,
253 char irq_num[4]; 269 * and no PHY number was provided to the MAC,
254 char *irq_str; 270 * use the one probed here.
255 271 */
256 /* 272 if (priv->plat->phy_addr == -1)
257 * If an IRQ was provided to be assigned after 273 priv->plat->phy_addr = addr;
258 * the bus probe, do it here. 274
259 */ 275 act = (priv->plat->phy_addr == addr);
260 if ((!mdio_bus_data->irqs) && 276 switch (phydev->irq) {
261 (mdio_bus_data->probed_phy_irq > 0)) { 277 case PHY_POLL:
262 new_bus->irq[addr] = 278 irq_str = "POLL";
263 mdio_bus_data->probed_phy_irq; 279 break;
264 phydev->irq = mdio_bus_data->probed_phy_irq; 280 case PHY_IGNORE_INTERRUPT:
265 } 281 irq_str = "IGNORE";
266 282 break;
267 /* 283 default:
268 * If we're going to bind the MAC to this PHY bus, 284 sprintf(irq_num, "%d", phydev->irq);
269 * and no PHY number was provided to the MAC, 285 irq_str = irq_num;
270 * use the one probed here. 286 break;
271 */
272 if (priv->plat->phy_addr == -1)
273 priv->plat->phy_addr = addr;
274
275 act = (priv->plat->phy_addr == addr);
276 switch (phydev->irq) {
277 case PHY_POLL:
278 irq_str = "POLL";
279 break;
280 case PHY_IGNORE_INTERRUPT:
281 irq_str = "IGNORE";
282 break;
283 default:
284 sprintf(irq_num, "%d", phydev->irq);
285 irq_str = irq_num;
286 break;
287 }
288 netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n",
289 phydev->phy_id, addr,
290 irq_str, phydev_name(phydev),
291 act ? " active" : "");
292 found = 1;
293 } 287 }
288 netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n",
289 phydev->phy_id, addr, irq_str, phydev_name(phydev),
290 act ? " active" : "");
291 found = 1;
294 } 292 }
295 293
296 if (!found && !mdio_node) { 294 if (!found && !mdio_node) {