mirror of https://gitee.com/openkylin/linux.git
net: hns: fix the wrong speed for bond
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>
This commit is contained in:
parent
cba80bdea7
commit
bb7189dc78
|
@ -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;
|
||||
|
||||
h->dev->ops->adjust_link(h, ndev->phydev->speed, ndev->phydev->duplex);
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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*/
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue