Skip to content

Commit

Permalink
net: ftgmac100: Get link speed and duplex for NC-SI
Browse files Browse the repository at this point in the history
The ethtool of this driver uses the phy API of ethtool
to get the link information from PHY driver.
Because the NC-SI is forced on 100Mbps and full duplex,
the driver connect a fixed-link phy driver for NC-SI.
The ethtool will get the link information from the
fixed-link phy driver.

Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20240827030513.481469-1-jacky_chou@aspeedtech.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jacky Chou authored and Jakub Kicinski committed Aug 29, 2024
1 parent 59a0ad4 commit e24a6c8
Showing 1 changed file with 26 additions and 2 deletions.
28 changes: 26 additions & 2 deletions drivers/net/ethernet/faraday/ftgmac100.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <linux/crc32.h>
#include <linux/if_vlan.h>
#include <linux/of_net.h>
#include <linux/phy_fixed.h>
#include <net/ip.h>
#include <net/ncsi.h>

Expand All @@ -50,6 +51,15 @@
#define FTGMAC_100MHZ 100000000
#define FTGMAC_25MHZ 25000000

/* For NC-SI to register a fixed-link phy device */
static struct fixed_phy_status ncsi_phy_status = {
.link = 1,
.speed = SPEED_100,
.duplex = DUPLEX_FULL,
.pause = 0,
.asym_pause = 0
};

struct ftgmac100 {
/* Registers */
struct resource *res;
Expand Down Expand Up @@ -1531,7 +1541,8 @@ static int ftgmac100_open(struct net_device *netdev)
if (netdev->phydev) {
/* If we have a PHY, start polling */
phy_start(netdev->phydev);
} else if (priv->use_ncsi) {
}
if (priv->use_ncsi) {
/* If using NC-SI, set our carrier on and start the stack */
netif_carrier_on(netdev);

Expand All @@ -1544,6 +1555,7 @@ static int ftgmac100_open(struct net_device *netdev)
return 0;

err_ncsi:
phy_stop(netdev->phydev);
napi_disable(&priv->napi);
netif_stop_queue(netdev);
err_alloc:
Expand Down Expand Up @@ -1577,7 +1589,7 @@ static int ftgmac100_stop(struct net_device *netdev)
netif_napi_del(&priv->napi);
if (netdev->phydev)
phy_stop(netdev->phydev);
else if (priv->use_ncsi)
if (priv->use_ncsi)
ncsi_stop_dev(priv->ndev);

ftgmac100_stop_hw(priv);
Expand Down Expand Up @@ -1715,6 +1727,9 @@ static void ftgmac100_phy_disconnect(struct net_device *netdev)
phy_disconnect(netdev->phydev);
if (of_phy_is_fixed_link(priv->dev->of_node))
of_phy_deregister_fixed_link(priv->dev->of_node);

if (priv->use_ncsi)
fixed_phy_unregister(netdev->phydev);
}

static void ftgmac100_destroy_mdio(struct net_device *netdev)
Expand Down Expand Up @@ -1792,6 +1807,7 @@ static int ftgmac100_probe(struct platform_device *pdev)
struct resource *res;
int irq;
struct net_device *netdev;
struct phy_device *phydev;
struct ftgmac100 *priv;
struct device_node *np;
int err = 0;
Expand Down Expand Up @@ -1879,6 +1895,14 @@ static int ftgmac100_probe(struct platform_device *pdev)
err = -EINVAL;
goto err_phy_connect;
}

phydev = fixed_phy_register(PHY_POLL, &ncsi_phy_status, NULL);
err = phy_connect_direct(netdev, phydev, ftgmac100_adjust_link,
PHY_INTERFACE_MODE_MII);
if (err) {
dev_err(&pdev->dev, "Connecting PHY failed\n");
goto err_phy_connect;
}
} else if (np && of_phy_is_fixed_link(np)) {
struct phy_device *phy;

Expand Down

0 comments on commit e24a6c8

Please sign in to comment.