diff options
| author | Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | 2014-10-22 14:26:46 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-10-24 15:49:20 -0400 |
| commit | 9d8ea73d3ebdf4ab8f1d2e447452fb0b504e3873 (patch) | |
| tree | 3e21e6c295af47c85c569e239e1c8d49d531b0d0 /drivers/net | |
| parent | e7de17abeda24d8acc316b2e07bd969d03099eea (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.c | 38 |
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 { | |||
| 197 | struct pxa168_eth_private { | 197 | struct 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 */ |
