aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2011-04-27 05:25:34 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2011-05-14 21:05:37 -0400
commitd034acf1851c15c3da56d31e7eb4151e40ed0119 (patch)
tree5eec4e3056f03293d5727086dd347eb238f3c5b4 /drivers/net/ixgbe
parentc83c6cbdbff360e5323748720dfb2b000c0ae491 (diff)
ixgbe: Merge ATR reinit into the service task
This change merges the ATR table reinitialization into the service task. This is yet another opportunity to avoid any race conditions as we don't want to be attempting to reinitialize the table during a possible reset. In addition this change adds a counter for table reinitialization so that it can be tracked as part of the regular statistics. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Tested-by: Evan Swanson <evan.swanson@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ixgbe')
-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;