aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Rustad <mark.d.rustad@intel.com>2015-08-08 19:18:48 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2015-09-24 01:43:22 -0400
commit58e7cd24d474c87763387f606e403012f562760b (patch)
treef2476ebdf75644b95754d5a06368cdd7b6211b4d
parent69eec0c2fa8781a6abae96af1f11069e1965cbfe (diff)
ixgbe: Limit SFP polling rate
Reduce the frequency of polling for SFP modules. Because the service task sometimes runs at high rates, we can poll for SFPs too often. When an SFP is not present, the I2C timeouts that result are very costly. So, prevent SFP polling from being done more than once every two seconds. To reduce latency, the poll time is cleared in a couple of cases to permit the next service task execution to poll the SFP module. Signed-off-by: Mark Rustad <mark.d.rustad@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h2
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c8
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index a699c991ad2c..dda0f678339a 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -594,6 +594,7 @@ struct ixgbe_mac_addr {
594 594
595/* default to trying for four seconds */ 595/* default to trying for four seconds */
596#define IXGBE_TRY_LINK_TIMEOUT (4 * HZ) 596#define IXGBE_TRY_LINK_TIMEOUT (4 * HZ)
597#define IXGBE_SFP_POLL_JIFFIES (2 * HZ) /* SFP poll every 2 seconds */
597 598
598/* board specific private data structure */ 599/* board specific private data structure */
599struct ixgbe_adapter { 600struct ixgbe_adapter {
@@ -707,6 +708,7 @@ struct ixgbe_adapter {
707 708
708 u32 link_speed; 709 u32 link_speed;
709 bool link_up; 710 bool link_up;
711 unsigned long sfp_poll_time;
710 unsigned long link_check_timeout; 712 unsigned long link_check_timeout;
711 713
712 struct timer_list service_timer; 714 struct timer_list service_timer;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 369204c18832..9986be5b84ca 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -2509,6 +2509,7 @@ static void ixgbe_check_sfp_event(struct ixgbe_adapter *adapter, u32 eicr)
2509 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask); 2509 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
2510 if (!test_bit(__IXGBE_DOWN, &adapter->state)) { 2510 if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
2511 adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET; 2511 adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
2512 adapter->sfp_poll_time = 0;
2512 ixgbe_service_event_schedule(adapter); 2513 ixgbe_service_event_schedule(adapter);
2513 } 2514 }
2514 } 2515 }
@@ -4804,6 +4805,7 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
4804 adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP; 4805 adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP;
4805 4806
4806 adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET; 4807 adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
4808 adapter->sfp_poll_time = 0;
4807} 4809}
4808 4810
4809/** 4811/**
@@ -6709,10 +6711,16 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
6709 !(adapter->flags2 & IXGBE_FLAG2_SFP_NEEDS_RESET)) 6711 !(adapter->flags2 & IXGBE_FLAG2_SFP_NEEDS_RESET))
6710 return; 6712 return;
6711 6713
6714 if (adapter->sfp_poll_time &&
6715 time_after(adapter->sfp_poll_time, jiffies))
6716 return; /* If not yet time to poll for SFP */
6717
6712 /* someone else is in init, wait until next service event */ 6718 /* someone else is in init, wait until next service event */
6713 if (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state)) 6719 if (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
6714 return; 6720 return;
6715 6721
6722 adapter->sfp_poll_time = jiffies + IXGBE_SFP_POLL_JIFFIES - 1;
6723
6716 err = hw->phy.ops.identify_sfp(hw); 6724 err = hw->phy.ops.identify_sfp(hw);
6717 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) 6725 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
6718 goto sfp_out; 6726 goto sfp_out;