Skip to content

Commit

Permalink
net: hns: fix the wrong speed for bond
Browse files Browse the repository at this point in the history
For debug-ports,there are two non-synchronized processes:
Speed-Auto-Negotiation and Link-Update-Status. The two
processes are towed by two different state machines.
Bond reads the speed when link up, but the speed maybe
not update the right value at that time.That make for bond's
wrong speed. Thus only one state machine should be used and
if phy_state_machine is used, it does not need to do
hns_nic_update_link_status().

Signed-off-by: Qianqian Xie <xieqianqian@huawei.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Qianqian Xie authored and David S. Miller committed Jun 21, 2016
1 parent cba80bd commit bb7189d
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 20 deletions.
43 changes: 24 additions & 19 deletions drivers/net/ethernet/hisilicon/hns/hns_enet.c
Original file line number Diff line number Diff line change
Expand Up @@ -991,8 +991,26 @@ static void hns_nic_adjust_link(struct net_device *ndev)
{
struct hns_nic_priv *priv = netdev_priv(ndev);
struct hnae_handle *h = priv->ae_handle;
int state = 1;

if (priv->phy) {
h->dev->ops->adjust_link(h, ndev->phydev->speed,
ndev->phydev->duplex);
state = priv->phy->link;
}
state = state && h->dev->ops->get_status(h);

h->dev->ops->adjust_link(h, ndev->phydev->speed, ndev->phydev->duplex);
if (state != priv->link) {
if (state) {
netif_carrier_on(ndev);
netif_tx_wake_all_queues(ndev);
netdev_info(ndev, "link up\n");
} else {
netif_carrier_off(ndev);
netdev_info(ndev, "link down\n");
}
priv->link = state;
}
}

/**
Expand Down Expand Up @@ -1577,27 +1595,14 @@ static void hns_nic_update_link_status(struct net_device *netdev)
struct hns_nic_priv *priv = netdev_priv(netdev);

struct hnae_handle *h = priv->ae_handle;
int state = 1;

if (priv->phy) {
if (!genphy_update_link(priv->phy))
state = priv->phy->link;
else
state = 0;
}
state = state && h->dev->ops->get_status(h);
if (h->phy_dev) {
if (h->phy_if != PHY_INTERFACE_MODE_XGMII)
return;

if (state != priv->link) {
if (state) {
netif_carrier_on(netdev);
netif_tx_wake_all_queues(netdev);
netdev_info(netdev, "link up\n");
} else {
netif_carrier_off(netdev);
netdev_info(netdev, "link down\n");
}
priv->link = state;
(void)genphy_read_status(h->phy_dev);
}
hns_nic_adjust_link(netdev);
}

/* for dumping key regs*/
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static u32 hns_nic_get_link(struct net_device *net_dev)
h = priv->ae_handle;

if (priv->phy) {
if (!genphy_update_link(priv->phy))
if (!genphy_read_status(priv->phy))
link_stat = priv->phy->link;
else
link_stat = 0;
Expand Down

0 comments on commit bb7189d

Please sign in to comment.