|
@@ -234,6 +234,24 @@ static int igb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static u32 igb_get_link(struct net_device *netdev)
|
|
|
+{
|
|
|
+ struct igb_adapter *adapter = netdev_priv(netdev);
|
|
|
+ struct e1000_mac_info *mac = &adapter->hw.mac;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the link is not reported up to netdev, interrupts are disabled,
|
|
|
+ * and so the physical link state may have changed since we last
|
|
|
+ * looked. Set get_link_status to make sure that the true link
|
|
|
+ * state is interrogated, rather than pulling a cached and possibly
|
|
|
+ * stale link state from the driver.
|
|
|
+ */
|
|
|
+ if (!netif_carrier_ok(netdev))
|
|
|
+ mac->get_link_status = 1;
|
|
|
+
|
|
|
+ return igb_has_link(adapter);
|
|
|
+}
|
|
|
+
|
|
|
static void igb_get_pauseparam(struct net_device *netdev,
|
|
|
struct ethtool_pauseparam *pause)
|
|
|
{
|
|
@@ -2077,7 +2095,7 @@ static const struct ethtool_ops igb_ethtool_ops = {
|
|
|
.get_msglevel = igb_get_msglevel,
|
|
|
.set_msglevel = igb_set_msglevel,
|
|
|
.nway_reset = igb_nway_reset,
|
|
|
- .get_link = ethtool_op_get_link,
|
|
|
+ .get_link = igb_get_link,
|
|
|
.get_eeprom_len = igb_get_eeprom_len,
|
|
|
.get_eeprom = igb_get_eeprom,
|
|
|
.set_eeprom = igb_set_eeprom,
|