aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>2014-10-22 14:26:46 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-24 15:49:20 -0400
commit9d8ea73d3ebdf4ab8f1d2e447452fb0b504e3873 (patch)
tree3e21e6c295af47c85c569e239e1c8d49d531b0d0 /drivers/net
parente7de17abeda24d8acc316b2e07bd969d03099eea (diff)
net: pxa168_eth: Prepare proper libphy handling
Current libphy handling in pxa168_eth lacks proper phy_connect. Prepare to fix this by first moving phy properties from platform_data to private driver data. Tested-by: Antoine Ténart <antoine.tenart@free-electrons.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/marvell/pxa168_eth.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c
index c3b209cd0660..3918887e09c5 100644
--- a/drivers/net/ethernet/marvell/pxa168_eth.c
+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
@@ -197,6 +197,9 @@ struct tx_desc {
197struct pxa168_eth_private { 197struct pxa168_eth_private {
198 int port_num; /* User Ethernet port number */ 198 int port_num; /* User Ethernet port number */
199 int phy_addr; 199 int phy_addr;
200 int phy_speed;
201 int phy_duplex;
202 phy_interface_t phy_intf;
200 203
201 int rx_resource_err; /* Rx ring resource error flag */ 204 int rx_resource_err; /* Rx ring resource error flag */
202 205
@@ -1394,19 +1397,17 @@ static void phy_init(struct pxa168_eth_private *pep)
1394{ 1397{
1395 struct phy_device *phy = pep->phy; 1398 struct phy_device *phy = pep->phy;
1396 1399
1397 phy_attach(pep->dev, dev_name(&phy->dev), PHY_INTERFACE_MODE_MII); 1400 phy_attach(pep->dev, dev_name(&phy->dev), pep->phy_intf);
1398 1401
1399 if (pep->pd && pep->pd->speed != 0) { 1402 phy->speed = pep->phy_speed;
1403 phy->duplex = pep->phy_duplex;
1404 phy->autoneg = AUTONEG_ENABLE;
1405 phy->supported &= PHY_BASIC_FEATURES;
1406 phy->advertising = phy->supported | ADVERTISED_Autoneg;
1407
1408 if (pep->phy_speed != 0) {
1400 phy->autoneg = AUTONEG_DISABLE; 1409 phy->autoneg = AUTONEG_DISABLE;
1401 phy->advertising = 0; 1410 phy->advertising = 0;
1402 phy->speed = pep->pd->speed;
1403 phy->duplex = pep->pd->duplex;
1404 } else {
1405 phy->autoneg = AUTONEG_ENABLE;
1406 phy->speed = 0;
1407 phy->duplex = 0;
1408 phy->supported &= PHY_BASIC_FEATURES;
1409 phy->advertising = phy->supported | ADVERTISED_Autoneg;
1410 } 1411 }
1411 1412
1412 phy_start_aneg(phy); 1413 phy_start_aneg(phy);
@@ -1416,9 +1417,6 @@ static int ethernet_phy_setup(struct net_device *dev)
1416{ 1417{
1417 struct pxa168_eth_private *pep = netdev_priv(dev); 1418 struct pxa168_eth_private *pep = netdev_priv(dev);
1418 1419
1419 if (pep->pd && pep->pd->init)
1420 pep->pd->init();
1421
1422 pep->phy = phy_scan(pep, pep->phy_addr & 0x1f); 1420 pep->phy = phy_scan(pep, pep->phy_addr & 0x1f);
1423 if (pep->phy != NULL) 1421 if (pep->phy != NULL)
1424 phy_init(pep); 1422 phy_init(pep);
@@ -1552,13 +1550,23 @@ static int pxa168_eth_probe(struct platform_device *pdev)
1552 1550
1553 pep->port_num = pep->pd->port_number; 1551 pep->port_num = pep->pd->port_number;
1554 pep->phy_addr = pep->pd->phy_addr; 1552 pep->phy_addr = pep->pd->phy_addr;
1553 pep->phy_speed = pep->pd->speed;
1554 pep->phy_duplex = pep->pd->duplex;
1555 pep->phy_intf = pep->pd->intf;
1556
1557 if (pep->pd->init)
1558 pep->pd->init();
1555 } else if (pdev->dev.of_node) { 1559 } else if (pdev->dev.of_node) {
1556 of_property_read_u32(pdev->dev.of_node, "port-id", 1560 of_property_read_u32(pdev->dev.of_node, "port-id",
1557 &pep->port_num); 1561 &pep->port_num);
1558 1562
1559 np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); 1563 np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
1560 if (np) 1564 if (!np) {
1561 of_property_read_u32(np, "reg", &pep->phy_addr); 1565 dev_err(&pdev->dev, "missing phy-handle\n");
1566 return -EINVAL;
1567 }
1568 of_property_read_u32(np, "reg", &pep->phy_addr);
1569 pep->phy_intf = of_get_phy_mode(pdev->dev.of_node);
1562 } 1570 }
1563 1571
1564 /* Hardware supports only 3 ports */ 1572 /* Hardware supports only 3 ports */