|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -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*/
|