aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ixgbe/ixgbe.h3
-rw-r--r--drivers/net/ixgbe/ixgbe_ethtool.c1
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c65
3 files changed, 37 insertions, 32 deletions
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h
index 760b850e8292..a180cde6008a 100644
--- a/drivers/net/ixgbe/ixgbe.h
+++ b/drivers/net/ixgbe/ixgbe.h
@@ -382,6 +382,7 @@ struct ixgbe_adapter {
382#define IXGBE_FLAG2_SEARCH_FOR_SFP (u32)(1 << 4) 382#define IXGBE_FLAG2_SEARCH_FOR_SFP (u32)(1 << 4)
383#define IXGBE_FLAG2_SFP_NEEDS_RESET (u32)(1 << 5) 383#define IXGBE_FLAG2_SFP_NEEDS_RESET (u32)(1 << 5)
384#define IXGBE_FLAG2_RESET_REQUESTED (u32)(1 << 6) 384#define IXGBE_FLAG2_RESET_REQUESTED (u32)(1 << 6)
385#define IXGBE_FLAG2_FDIR_REQUIRES_REINIT (u32)(1 << 7)
385 386
386 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 387 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
387 u16 bd_number; 388 u16 bd_number;
@@ -455,12 +456,12 @@ struct ixgbe_adapter {
455 bool link_up; 456 bool link_up;
456 unsigned long link_check_timeout; 457 unsigned long link_check_timeout;
457 458
458 struct work_struct fdir_reinit_task;
459 struct work_struct check_overtemp_task; 459 struct work_struct check_overtemp_task;
460 struct work_struct service_task; 460 struct work_struct service_task;
461 struct timer_list service_timer; 461 struct timer_list service_timer;
462 u32 fdir_pballoc; 462 u32 fdir_pballoc;
463 u32 atr_sample_rate; 463 u32 atr_sample_rate;
464 unsigned long fdir_overflow; /* number of times ATR was backed off */
464 spinlock_t fdir_perfect_lock; 465 spinlock_t fdir_perfect_lock;
465#ifdef IXGBE_FCOE 466#ifdef IXGBE_FCOE
466 struct ixgbe_fcoe fcoe; 467 struct ixgbe_fcoe fcoe;
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c
index 1fdd075afe79..cb1555bc8548 100644
--- a/drivers/net/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ixgbe/ixgbe_ethtool.c
@@ -84,6 +84,7 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = {
84 {"hw_rsc_flushed", IXGBE_STAT(rsc_total_flush)}, 84 {"hw_rsc_flushed", IXGBE_STAT(rsc_total_flush)},
85 {"fdir_match", IXGBE_STAT(stats.fdirmatch)}, 85 {"fdir_match", IXGBE_STAT(stats.fdirmatch)},
86 {"fdir_miss", IXGBE_STAT(stats.fdirmiss)}, 86 {"fdir_miss", IXGBE_STAT(stats.fdirmiss)},
87 {"fdir_overflow", IXGBE_STAT(fdir_overflow)},
87 {"rx_fifo_errors", IXGBE_NETDEV_STAT(rx_fifo_errors)}, 88 {"rx_fifo_errors", IXGBE_NETDEV_STAT(rx_fifo_errors)},
88 {"rx_missed_errors", IXGBE_NETDEV_STAT(rx_missed_errors)}, 89 {"rx_missed_errors", IXGBE_NETDEV_STAT(rx_missed_errors)},
89 {"tx_aborted_errors", IXGBE_NETDEV_STAT(tx_aborted_errors)}, 90 {"tx_aborted_errors", IXGBE_NETDEV_STAT(tx_aborted_errors)},
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index dbb20e57f660..7edd3603344a 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -1950,16 +1950,20 @@ static irqreturn_t ixgbe_msix_lsc(int irq, void *data)
1950 case ixgbe_mac_X540: 1950 case ixgbe_mac_X540:
1951 /* Handle Flow Director Full threshold interrupt */ 1951 /* Handle Flow Director Full threshold interrupt */
1952 if (eicr & IXGBE_EICR_FLOW_DIR) { 1952 if (eicr & IXGBE_EICR_FLOW_DIR) {
1953 int reinit_count = 0;
1953 int i; 1954 int i;
1954 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR);
1955 /* Disable transmits before FDIR Re-initialization */
1956 netif_tx_stop_all_queues(netdev);
1957 for (i = 0; i < adapter->num_tx_queues; i++) { 1955 for (i = 0; i < adapter->num_tx_queues; i++) {
1958 struct ixgbe_ring *tx_ring = 1956 struct ixgbe_ring *ring = adapter->tx_ring[i];
1959 adapter->tx_ring[i];
1960 if (test_and_clear_bit(__IXGBE_TX_FDIR_INIT_DONE, 1957 if (test_and_clear_bit(__IXGBE_TX_FDIR_INIT_DONE,
1961 &tx_ring->state)) 1958 &ring->state))
1962 schedule_work(&adapter->fdir_reinit_task); 1959 reinit_count++;
1960 }
1961 if (reinit_count) {
1962 /* no more flow director interrupts until after init */
1963 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR);
1964 eicr &= ~IXGBE_EICR_FLOW_DIR;
1965 adapter->flags2 |= IXGBE_FLAG2_FDIR_REQUIRES_REINIT;
1966 ixgbe_service_event_schedule(adapter);
1963 } 1967 }
1964 } 1968 }
1965 break; 1969 break;
@@ -4198,7 +4202,8 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
4198 4202
4199 ixgbe_napi_disable_all(adapter); 4203 ixgbe_napi_disable_all(adapter);
4200 4204
4201 adapter->flags2 &= ~IXGBE_FLAG2_RESET_REQUESTED; 4205 adapter->flags2 &= ~(IXGBE_FLAG2_FDIR_REQUIRES_REINIT |
4206 IXGBE_FLAG2_RESET_REQUESTED);
4202 adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE; 4207 adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE;
4203 4208
4204 del_timer_sync(&adapter->service_timer); 4209 del_timer_sync(&adapter->service_timer);
@@ -4212,13 +4217,6 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
4212 free_cpumask_var(q_vector->affinity_mask); 4217 free_cpumask_var(q_vector->affinity_mask);
4213 } 4218 }
4214 4219
4215 if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
4216 adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
4217 cancel_work_sync(&adapter->fdir_reinit_task);
4218
4219 if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE)
4220 cancel_work_sync(&adapter->check_overtemp_task);
4221
4222 /* disable transmits in the hardware now that interrupts are off */ 4220 /* disable transmits in the hardware now that interrupts are off */
4223 for (i = 0; i < adapter->num_tx_queues; i++) { 4221 for (i = 0; i < adapter->num_tx_queues; i++) {
4224 u8 reg_idx = adapter->tx_ring[i]->reg_idx; 4222 u8 reg_idx = adapter->tx_ring[i]->reg_idx;
@@ -5950,27 +5948,39 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
5950} 5948}
5951 5949
5952/** 5950/**
5953 * ixgbe_fdir_reinit_task - worker thread to reinit FDIR filter table 5951 * ixgbe_fdir_reinit_subtask - worker thread to reinit FDIR filter table
5954 * @work: pointer to work_struct containing our data 5952 * @adapter - pointer to the device adapter structure
5955 **/ 5953 **/
5956static void ixgbe_fdir_reinit_task(struct work_struct *work) 5954static void ixgbe_fdir_reinit_subtask(struct ixgbe_adapter *adapter)
5957{ 5955{
5958 struct ixgbe_adapter *adapter = container_of(work,
5959 struct ixgbe_adapter,
5960 fdir_reinit_task);
5961 struct ixgbe_hw *hw = &adapter->hw; 5956 struct ixgbe_hw *hw = &adapter->hw;
5962 int i; 5957 int i;
5963 5958
5959 if (!(adapter->flags2 & IXGBE_FLAG2_FDIR_REQUIRES_REINIT))
5960 return;
5961
5962 adapter->flags2 &= ~IXGBE_FLAG2_FDIR_REQUIRES_REINIT;
5963
5964 /* if interface is down do nothing */
5965 if (test_bit(__IXGBE_DOWN, &adapter->state))
5966 return;
5967
5968 /* do nothing if we are not using signature filters */
5969 if (!(adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE))
5970 return;
5971
5972 adapter->fdir_overflow++;
5973
5964 if (ixgbe_reinit_fdir_tables_82599(hw) == 0) { 5974 if (ixgbe_reinit_fdir_tables_82599(hw) == 0) {
5965 for (i = 0; i < adapter->num_tx_queues; i++) 5975 for (i = 0; i < adapter->num_tx_queues; i++)
5966 set_bit(__IXGBE_TX_FDIR_INIT_DONE, 5976 set_bit(__IXGBE_TX_FDIR_INIT_DONE,
5967 &(adapter->tx_ring[i]->state)); 5977 &(adapter->tx_ring[i]->state));
5978 /* re-enable flow director interrupts */
5979 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_FLOW_DIR);
5968 } else { 5980 } else {
5969 e_err(probe, "failed to finish FDIR re-initialization, " 5981 e_err(probe, "failed to finish FDIR re-initialization, "
5970 "ignored adding FDIR ATR filters\n"); 5982 "ignored adding FDIR ATR filters\n");
5971 } 5983 }
5972 /* Done FDIR Re-initialization, enable transmits */
5973 netif_tx_start_all_queues(adapter->netdev);
5974} 5984}
5975 5985
5976/** 5986/**
@@ -6370,6 +6380,7 @@ static void ixgbe_service_task(struct work_struct *work)
6370 ixgbe_sfp_detection_subtask(adapter); 6380 ixgbe_sfp_detection_subtask(adapter);
6371 ixgbe_sfp_link_config_subtask(adapter); 6381 ixgbe_sfp_link_config_subtask(adapter);
6372 ixgbe_watchdog_subtask(adapter); 6382 ixgbe_watchdog_subtask(adapter);
6383 ixgbe_fdir_reinit_subtask(adapter);
6373 ixgbe_check_hang_subtask(adapter); 6384 ixgbe_check_hang_subtask(adapter);
6374 6385
6375 ixgbe_service_event_complete(adapter); 6386 ixgbe_service_event_complete(adapter);
@@ -7637,10 +7648,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
7637 /* carrier off reporting is important to ethtool even BEFORE open */ 7648 /* carrier off reporting is important to ethtool even BEFORE open */
7638 netif_carrier_off(netdev); 7649 netif_carrier_off(netdev);
7639 7650
7640 if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
7641 adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
7642 INIT_WORK(&adapter->fdir_reinit_task, ixgbe_fdir_reinit_task);
7643
7644 if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE) 7651 if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE)
7645 INIT_WORK(&adapter->check_overtemp_task, 7652 INIT_WORK(&adapter->check_overtemp_task,
7646 ixgbe_check_overtemp_task); 7653 ixgbe_check_overtemp_task);
@@ -7700,12 +7707,8 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
7700 set_bit(__IXGBE_DOWN, &adapter->state); 7707 set_bit(__IXGBE_DOWN, &adapter->state);
7701 cancel_work_sync(&adapter->service_task); 7708 cancel_work_sync(&adapter->service_task);
7702 7709
7703 if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
7704 adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
7705 cancel_work_sync(&adapter->fdir_reinit_task);
7706 if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE) 7710 if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE)
7707 cancel_work_sync(&adapter->check_overtemp_task); 7711 cancel_work_sync(&adapter->check_overtemp_task);
7708
7709#ifdef CONFIG_IXGBE_DCA 7712#ifdef CONFIG_IXGBE_DCA
7710 if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { 7713 if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) {
7711 adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED; 7714 adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED;