diff options
-rw-r--r-- | drivers/net/ixgbe/ixgbe.h | 3 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_ethtool.c | 1 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 65 |
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 | **/ |
5956 | static void ixgbe_fdir_reinit_task(struct work_struct *work) | 5954 | static 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; |