diff options
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 32 |
2 files changed, 32 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index c1fae7aa0bd5..6807b098edae 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h | |||
@@ -448,6 +448,8 @@ struct igb_adapter { | |||
448 | struct i2c_client *i2c_client; | 448 | struct i2c_client *i2c_client; |
449 | u32 rss_indir_tbl_init; | 449 | u32 rss_indir_tbl_init; |
450 | u8 rss_indir_tbl[IGB_RETA_SIZE]; | 450 | u8 rss_indir_tbl[IGB_RETA_SIZE]; |
451 | |||
452 | unsigned long link_check_timeout; | ||
451 | }; | 453 | }; |
452 | 454 | ||
453 | #define IGB_FLAG_HAS_MSI (1 << 0) | 455 | #define IGB_FLAG_HAS_MSI (1 << 0) |
@@ -459,6 +461,7 @@ struct igb_adapter { | |||
459 | #define IGB_FLAG_RSS_FIELD_IPV4_UDP (1 << 6) | 461 | #define IGB_FLAG_RSS_FIELD_IPV4_UDP (1 << 6) |
460 | #define IGB_FLAG_RSS_FIELD_IPV6_UDP (1 << 7) | 462 | #define IGB_FLAG_RSS_FIELD_IPV6_UDP (1 << 7) |
461 | #define IGB_FLAG_WOL_SUPPORTED (1 << 8) | 463 | #define IGB_FLAG_WOL_SUPPORTED (1 << 8) |
464 | #define IGB_FLAG_NEED_LINK_UPDATE (1 << 9) | ||
462 | 465 | ||
463 | /* DMA Coalescing defines */ | 466 | /* DMA Coalescing defines */ |
464 | #define IGB_MIN_TXPBSIZE 20408 | 467 | #define IGB_MIN_TXPBSIZE 20408 |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 78f49cf94e82..b209ca56d50b 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -1671,6 +1671,8 @@ void igb_down(struct igb_adapter *adapter) | |||
1671 | 1671 | ||
1672 | igb_irq_disable(adapter); | 1672 | igb_irq_disable(adapter); |
1673 | 1673 | ||
1674 | adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; | ||
1675 | |||
1674 | for (i = 0; i < adapter->num_q_vectors; i++) { | 1676 | for (i = 0; i < adapter->num_q_vectors; i++) { |
1675 | napi_synchronize(&(adapter->q_vector[i]->napi)); | 1677 | napi_synchronize(&(adapter->q_vector[i]->napi)); |
1676 | napi_disable(&(adapter->q_vector[i]->napi)); | 1678 | napi_disable(&(adapter->q_vector[i]->napi)); |
@@ -3886,6 +3888,17 @@ bool igb_has_link(struct igb_adapter *adapter) | |||
3886 | break; | 3888 | break; |
3887 | } | 3889 | } |
3888 | 3890 | ||
3891 | if (((hw->mac.type == e1000_i210) || | ||
3892 | (hw->mac.type == e1000_i211)) && | ||
3893 | (hw->phy.id == I210_I_PHY_ID)) { | ||
3894 | if (!netif_carrier_ok(adapter->netdev)) { | ||
3895 | adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; | ||
3896 | } else if (!(adapter->flags & IGB_FLAG_NEED_LINK_UPDATE)) { | ||
3897 | adapter->flags |= IGB_FLAG_NEED_LINK_UPDATE; | ||
3898 | adapter->link_check_timeout = jiffies; | ||
3899 | } | ||
3900 | } | ||
3901 | |||
3889 | return link_active; | 3902 | return link_active; |
3890 | } | 3903 | } |
3891 | 3904 | ||
@@ -3930,6 +3943,14 @@ static void igb_watchdog_task(struct work_struct *work) | |||
3930 | int i; | 3943 | int i; |
3931 | 3944 | ||
3932 | link = igb_has_link(adapter); | 3945 | link = igb_has_link(adapter); |
3946 | |||
3947 | if (adapter->flags & IGB_FLAG_NEED_LINK_UPDATE) { | ||
3948 | if (time_after(jiffies, (adapter->link_check_timeout + HZ))) | ||
3949 | adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; | ||
3950 | else | ||
3951 | link = false; | ||
3952 | } | ||
3953 | |||
3933 | if (link) { | 3954 | if (link) { |
3934 | /* Cancel scheduled suspend requests. */ | 3955 | /* Cancel scheduled suspend requests. */ |
3935 | pm_runtime_resume(netdev->dev.parent); | 3956 | pm_runtime_resume(netdev->dev.parent); |
@@ -4054,9 +4075,14 @@ static void igb_watchdog_task(struct work_struct *work) | |||
4054 | igb_ptp_rx_hang(adapter); | 4075 | igb_ptp_rx_hang(adapter); |
4055 | 4076 | ||
4056 | /* Reset the timer */ | 4077 | /* Reset the timer */ |
4057 | if (!test_bit(__IGB_DOWN, &adapter->state)) | 4078 | if (!test_bit(__IGB_DOWN, &adapter->state)) { |
4058 | mod_timer(&adapter->watchdog_timer, | 4079 | if (adapter->flags & IGB_FLAG_NEED_LINK_UPDATE) |
4059 | round_jiffies(jiffies + 2 * HZ)); | 4080 | mod_timer(&adapter->watchdog_timer, |
4081 | round_jiffies(jiffies + HZ)); | ||
4082 | else | ||
4083 | mod_timer(&adapter->watchdog_timer, | ||
4084 | round_jiffies(jiffies + 2 * HZ)); | ||
4085 | } | ||
4060 | } | 4086 | } |
4061 | 4087 | ||
4062 | enum latency_range { | 4088 | enum latency_range { |