aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe/ixgbe_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c364
1 files changed, 200 insertions, 164 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index a5d4226eee0..d1e52b5cebf 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -1900,7 +1900,7 @@ static void ixgbe_check_lsc(struct ixgbe_adapter *adapter)
1900 if (!test_bit(__IXGBE_DOWN, &adapter->state)) { 1900 if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
1901 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC); 1901 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
1902 IXGBE_WRITE_FLUSH(hw); 1902 IXGBE_WRITE_FLUSH(hw);
1903 schedule_work(&adapter->watchdog_task); 1903 ixgbe_service_event_schedule(adapter);
1904 } 1904 }
1905} 1905}
1906 1906
@@ -3940,7 +3940,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
3940 * link up interrupt but shouldn't be a problem */ 3940 * link up interrupt but shouldn't be a problem */
3941 adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; 3941 adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
3942 adapter->link_check_timeout = jiffies; 3942 adapter->link_check_timeout = jiffies;
3943 mod_timer(&adapter->watchdog_timer, jiffies);
3944 mod_timer(&adapter->service_timer, jiffies); 3943 mod_timer(&adapter->service_timer, jiffies);
3945 3944
3946 /* Set PF Reset Done bit so PF/VF Mail Ops can work */ 3945 /* Set PF Reset Done bit so PF/VF Mail Ops can work */
@@ -4179,8 +4178,6 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
4179 4178
4180 netif_tx_stop_all_queues(netdev); 4179 netif_tx_stop_all_queues(netdev);
4181 4180
4182 del_timer_sync(&adapter->watchdog_timer);
4183 cancel_work_sync(&adapter->watchdog_task);
4184 /* call carrier off first to avoid false dev_watchdog timeouts */ 4181 /* call carrier off first to avoid false dev_watchdog timeouts */
4185 netif_carrier_off(netdev); 4182 netif_carrier_off(netdev);
4186 netif_tx_disable(netdev); 4183 netif_tx_disable(netdev);
@@ -5957,23 +5954,54 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
5957} 5954}
5958 5955
5959/** 5956/**
5960 * ixgbe_watchdog - Timer Call-back 5957 * ixgbe_fdir_reinit_task - worker thread to reinit FDIR filter table
5961 * @data: pointer to adapter cast into an unsigned long 5958 * @work: pointer to work_struct containing our data
5962 **/ 5959 **/
5963static void ixgbe_watchdog(unsigned long data) 5960static void ixgbe_fdir_reinit_task(struct work_struct *work)
5961{
5962 struct ixgbe_adapter *adapter = container_of(work,
5963 struct ixgbe_adapter,
5964 fdir_reinit_task);
5965 struct ixgbe_hw *hw = &adapter->hw;
5966 int i;
5967
5968 if (ixgbe_reinit_fdir_tables_82599(hw) == 0) {
5969 for (i = 0; i < adapter->num_tx_queues; i++)
5970 set_bit(__IXGBE_TX_FDIR_INIT_DONE,
5971 &(adapter->tx_ring[i]->state));
5972 } else {
5973 e_err(probe, "failed to finish FDIR re-initialization, "
5974 "ignored adding FDIR ATR filters\n");
5975 }
5976 /* Done FDIR Re-initialization, enable transmits */
5977 netif_tx_start_all_queues(adapter->netdev);
5978}
5979
5980/**
5981 * ixgbe_check_hang_subtask - check for hung queues and dropped interrupts
5982 * @adapter - pointer to the device adapter structure
5983 *
5984 * This function serves two purposes. First it strobes the interrupt lines
5985 * in order to make certain interrupts are occuring. Secondly it sets the
5986 * bits needed to check for TX hangs. As a result we should immediately
5987 * determine if a hang has occured.
5988 */
5989static void ixgbe_check_hang_subtask(struct ixgbe_adapter *adapter)
5964{ 5990{
5965 struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)data;
5966 struct ixgbe_hw *hw = &adapter->hw; 5991 struct ixgbe_hw *hw = &adapter->hw;
5967 u64 eics = 0; 5992 u64 eics = 0;
5968 int i; 5993 int i;
5969 5994
5970 /* 5995 /* If we're down or resetting, just bail */
5971 * Do the watchdog outside of interrupt context due to the lovely 5996 if (test_bit(__IXGBE_DOWN, &adapter->state) ||
5972 * delays that some of the newer hardware requires 5997 test_bit(__IXGBE_RESETTING, &adapter->state))
5973 */ 5998 return;
5974 5999
5975 if (test_bit(__IXGBE_DOWN, &adapter->state)) 6000 /* Force detection of hung controller */
5976 goto watchdog_short_circuit; 6001 if (netif_carrier_ok(adapter->netdev)) {
6002 for (i = 0; i < adapter->num_tx_queues; i++)
6003 set_check_for_tx_hang(adapter->tx_ring[i]);
6004 }
5977 6005
5978 if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { 6006 if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
5979 /* 6007 /*
@@ -5983,179 +6011,157 @@ static void ixgbe_watchdog(unsigned long data)
5983 */ 6011 */
5984 IXGBE_WRITE_REG(hw, IXGBE_EICS, 6012 IXGBE_WRITE_REG(hw, IXGBE_EICS,
5985 (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); 6013 (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER));
5986 goto watchdog_reschedule; 6014 } else {
5987 } 6015 /* get one bit for every active tx/rx interrupt vector */
5988 6016 for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) {
5989 /* get one bit for every active tx/rx interrupt vector */ 6017 struct ixgbe_q_vector *qv = adapter->q_vector[i];
5990 for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) { 6018 if (qv->rxr_count || qv->txr_count)
5991 struct ixgbe_q_vector *qv = adapter->q_vector[i]; 6019 eics |= ((u64)1 << i);
5992 if (qv->rxr_count || qv->txr_count) 6020 }
5993 eics |= ((u64)1 << i);
5994 } 6021 }
5995 6022
5996 /* Cause software interrupt to ensure rx rings are cleaned */ 6023 /* Cause software interrupt to ensure rings are cleaned */
5997 ixgbe_irq_rearm_queues(adapter, eics); 6024 ixgbe_irq_rearm_queues(adapter, eics);
5998 6025
5999watchdog_reschedule:
6000 /* Reset the timer */
6001 mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ));
6002
6003watchdog_short_circuit:
6004 schedule_work(&adapter->watchdog_task);
6005} 6026}
6006 6027
6007/** 6028/**
6008 * ixgbe_fdir_reinit_task - worker thread to reinit FDIR filter table 6029 * ixgbe_watchdog_update_link - update the link status
6009 * @work: pointer to work_struct containing our data 6030 * @adapter - pointer to the device adapter structure
6031 * @link_speed - pointer to a u32 to store the link_speed
6010 **/ 6032 **/
6011static void ixgbe_fdir_reinit_task(struct work_struct *work) 6033static void ixgbe_watchdog_update_link(struct ixgbe_adapter *adapter)
6012{ 6034{
6013 struct ixgbe_adapter *adapter = container_of(work,
6014 struct ixgbe_adapter,
6015 fdir_reinit_task);
6016 struct ixgbe_hw *hw = &adapter->hw; 6035 struct ixgbe_hw *hw = &adapter->hw;
6036 u32 link_speed = adapter->link_speed;
6037 bool link_up = adapter->link_up;
6017 int i; 6038 int i;
6018 6039
6019 if (ixgbe_reinit_fdir_tables_82599(hw) == 0) { 6040 if (!(adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE))
6020 for (i = 0; i < adapter->num_tx_queues; i++) 6041 return;
6021 set_bit(__IXGBE_TX_FDIR_INIT_DONE, 6042
6022 &(adapter->tx_ring[i]->state)); 6043 if (hw->mac.ops.check_link) {
6044 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
6023 } else { 6045 } else {
6024 e_err(probe, "failed to finish FDIR re-initialization, " 6046 /* always assume link is up, if no check link function */
6025 "ignored adding FDIR ATR filters\n"); 6047 link_speed = IXGBE_LINK_SPEED_10GB_FULL;
6048 link_up = true;
6026 } 6049 }
6027 /* Done FDIR Re-initialization, enable transmits */ 6050 if (link_up) {
6028 netif_tx_start_all_queues(adapter->netdev); 6051 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
6052 for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
6053 hw->mac.ops.fc_enable(hw, i);
6054 } else {
6055 hw->mac.ops.fc_enable(hw, 0);
6056 }
6057 }
6058
6059 if (link_up ||
6060 time_after(jiffies, (adapter->link_check_timeout +
6061 IXGBE_TRY_LINK_TIMEOUT))) {
6062 adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE;
6063 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMC_LSC);
6064 IXGBE_WRITE_FLUSH(hw);
6065 }
6066
6067 adapter->link_up = link_up;
6068 adapter->link_speed = link_speed;
6029} 6069}
6030 6070
6031static void ixgbe_spoof_check(struct ixgbe_adapter *adapter) 6071/**
6072 * ixgbe_watchdog_link_is_up - update netif_carrier status and
6073 * print link up message
6074 * @adapter - pointer to the device adapter structure
6075 **/
6076static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)
6032{ 6077{
6033 u32 ssvpc; 6078 struct net_device *netdev = adapter->netdev;
6079 struct ixgbe_hw *hw = &adapter->hw;
6080 u32 link_speed = adapter->link_speed;
6081 bool flow_rx, flow_tx;
6034 6082
6035 /* Do not perform spoof check for 82598 */ 6083 /* only continue if link was previously down */
6036 if (adapter->hw.mac.type == ixgbe_mac_82598EB) 6084 if (netif_carrier_ok(netdev))
6037 return; 6085 return;
6038 6086
6039 ssvpc = IXGBE_READ_REG(&adapter->hw, IXGBE_SSVPC); 6087 adapter->flags2 &= ~IXGBE_FLAG2_SEARCH_FOR_SFP;
6040 6088
6041 /* 6089 switch (hw->mac.type) {
6042 * ssvpc register is cleared on read, if zero then no 6090 case ixgbe_mac_82598EB: {
6043 * spoofed packets in the last interval. 6091 u32 frctl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
6044 */ 6092 u32 rmcs = IXGBE_READ_REG(hw, IXGBE_RMCS);
6045 if (!ssvpc) 6093 flow_rx = !!(frctl & IXGBE_FCTRL_RFCE);
6046 return; 6094 flow_tx = !!(rmcs & IXGBE_RMCS_TFCE_802_3X);
6095 }
6096 break;
6097 case ixgbe_mac_X540:
6098 case ixgbe_mac_82599EB: {
6099 u32 mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
6100 u32 fccfg = IXGBE_READ_REG(hw, IXGBE_FCCFG);
6101 flow_rx = !!(mflcn & IXGBE_MFLCN_RFCE);
6102 flow_tx = !!(fccfg & IXGBE_FCCFG_TFCE_802_3X);
6103 }
6104 break;
6105 default:
6106 flow_tx = false;
6107 flow_rx = false;
6108 break;
6109 }
6110 e_info(drv, "NIC Link is Up %s, Flow Control: %s\n",
6111 (link_speed == IXGBE_LINK_SPEED_10GB_FULL ?
6112 "10 Gbps" :
6113 (link_speed == IXGBE_LINK_SPEED_1GB_FULL ?
6114 "1 Gbps" :
6115 (link_speed == IXGBE_LINK_SPEED_100_FULL ?
6116 "100 Mbps" :
6117 "unknown speed"))),
6118 ((flow_rx && flow_tx) ? "RX/TX" :
6119 (flow_rx ? "RX" :
6120 (flow_tx ? "TX" : "None"))));
6047 6121
6048 e_warn(drv, "%d Spoofed packets detected\n", ssvpc); 6122 netif_carrier_on(netdev);
6123#ifdef HAVE_IPLINK_VF_CONFIG
6124 ixgbe_check_vf_rate_limit(adapter);
6125#endif /* HAVE_IPLINK_VF_CONFIG */
6049} 6126}
6050 6127
6051static DEFINE_MUTEX(ixgbe_watchdog_lock);
6052
6053/** 6128/**
6054 * ixgbe_watchdog_task - worker thread to bring link up 6129 * ixgbe_watchdog_link_is_down - update netif_carrier status and
6055 * @work: pointer to work_struct containing our data 6130 * print link down message
6131 * @adapter - pointer to the adapter structure
6056 **/ 6132 **/
6057static void ixgbe_watchdog_task(struct work_struct *work) 6133static void ixgbe_watchdog_link_is_down(struct ixgbe_adapter* adapter)
6058{ 6134{
6059 struct ixgbe_adapter *adapter = container_of(work,
6060 struct ixgbe_adapter,
6061 watchdog_task);
6062 struct net_device *netdev = adapter->netdev; 6135 struct net_device *netdev = adapter->netdev;
6063 struct ixgbe_hw *hw = &adapter->hw; 6136 struct ixgbe_hw *hw = &adapter->hw;
6064 u32 link_speed;
6065 bool link_up;
6066 int i;
6067 struct ixgbe_ring *tx_ring;
6068 int some_tx_pending = 0;
6069
6070 mutex_lock(&ixgbe_watchdog_lock);
6071 6137
6072 link_up = adapter->link_up; 6138 adapter->link_up = false;
6073 link_speed = adapter->link_speed; 6139 adapter->link_speed = 0;
6074 6140
6075 if (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE) { 6141 /* only continue if link was up previously */
6076 hw->mac.ops.check_link(hw, &link_speed, &link_up, false); 6142 if (!netif_carrier_ok(netdev))
6077 if (link_up) { 6143 return;
6078#ifdef CONFIG_DCB
6079 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
6080 for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
6081 hw->mac.ops.fc_enable(hw, i);
6082 } else {
6083 hw->mac.ops.fc_enable(hw, 0);
6084 }
6085#else
6086 hw->mac.ops.fc_enable(hw, 0);
6087#endif
6088 }
6089 6144
6090 if (link_up || 6145 /* poll for SFP+ cable when link is down */
6091 time_after(jiffies, (adapter->link_check_timeout + 6146 if (ixgbe_is_sfp(hw) && hw->mac.type == ixgbe_mac_82598EB)
6092 IXGBE_TRY_LINK_TIMEOUT))) { 6147 adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP;
6093 adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE;
6094 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMC_LSC);
6095 }
6096 adapter->link_up = link_up;
6097 adapter->link_speed = link_speed;
6098 }
6099 6148
6100 if (link_up) { 6149 e_info(drv, "NIC Link is Down\n");
6101 if (!netif_carrier_ok(netdev)) { 6150 netif_carrier_off(netdev);
6102 bool flow_rx, flow_tx; 6151}
6103
6104 switch (hw->mac.type) {
6105 case ixgbe_mac_82598EB: {
6106 u32 frctl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
6107 u32 rmcs = IXGBE_READ_REG(hw, IXGBE_RMCS);
6108 flow_rx = !!(frctl & IXGBE_FCTRL_RFCE);
6109 flow_tx = !!(rmcs & IXGBE_RMCS_TFCE_802_3X);
6110 }
6111 break;
6112 case ixgbe_mac_82599EB:
6113 case ixgbe_mac_X540: {
6114 u32 mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
6115 u32 fccfg = IXGBE_READ_REG(hw, IXGBE_FCCFG);
6116 flow_rx = !!(mflcn & IXGBE_MFLCN_RFCE);
6117 flow_tx = !!(fccfg & IXGBE_FCCFG_TFCE_802_3X);
6118 }
6119 break;
6120 default:
6121 flow_tx = false;
6122 flow_rx = false;
6123 break;
6124 }
6125 6152
6126 e_info(drv, "NIC Link is Up %s, Flow Control: %s\n", 6153/**
6127 (link_speed == IXGBE_LINK_SPEED_10GB_FULL ? 6154 * ixgbe_watchdog_flush_tx - flush queues on link down
6128 "10 Gbps" : 6155 * @adapter - pointer to the device adapter structure
6129 (link_speed == IXGBE_LINK_SPEED_1GB_FULL ? 6156 **/
6130 "1 Gbps" : 6157static void ixgbe_watchdog_flush_tx(struct ixgbe_adapter *adapter)
6131 (link_speed == IXGBE_LINK_SPEED_100_FULL ? 6158{
6132 "100 Mbps" : 6159 int i;
6133 "unknown speed"))), 6160 int some_tx_pending = 0;
6134 ((flow_rx && flow_tx) ? "RX/TX" :
6135 (flow_rx ? "RX" :
6136 (flow_tx ? "TX" : "None"))));
6137
6138 netif_carrier_on(netdev);
6139 ixgbe_check_vf_rate_limit(adapter);
6140 } else {
6141 /* Force detection of hung controller */
6142 for (i = 0; i < adapter->num_tx_queues; i++) {
6143 tx_ring = adapter->tx_ring[i];
6144 set_check_for_tx_hang(tx_ring);
6145 }
6146 }
6147 } else {
6148 adapter->link_up = false;
6149 adapter->link_speed = 0;
6150 if (netif_carrier_ok(netdev)) {
6151 e_info(drv, "NIC Link is Down\n");
6152 netif_carrier_off(netdev);
6153 }
6154 }
6155 6161
6156 if (!netif_carrier_ok(netdev)) { 6162 if (!netif_carrier_ok(adapter->netdev)) {
6157 for (i = 0; i < adapter->num_tx_queues; i++) { 6163 for (i = 0; i < adapter->num_tx_queues; i++) {
6158 tx_ring = adapter->tx_ring[i]; 6164 struct ixgbe_ring *tx_ring = adapter->tx_ring[i];
6159 if (tx_ring->next_to_use != tx_ring->next_to_clean) { 6165 if (tx_ring->next_to_use != tx_ring->next_to_clean) {
6160 some_tx_pending = 1; 6166 some_tx_pending = 1;
6161 break; 6167 break;
@@ -6168,13 +6174,52 @@ static void ixgbe_watchdog_task(struct work_struct *work)
6168 * to get done, so reset controller to flush Tx. 6174 * to get done, so reset controller to flush Tx.
6169 * (Do the reset outside of interrupt context). 6175 * (Do the reset outside of interrupt context).
6170 */ 6176 */
6171 schedule_work(&adapter->reset_task); 6177 schedule_work(&adapter->reset_task);
6172 } 6178 }
6173 } 6179 }
6180}
6181
6182static void ixgbe_spoof_check(struct ixgbe_adapter *adapter)
6183{
6184 u32 ssvpc;
6185
6186 /* Do not perform spoof check for 82598 */
6187 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
6188 return;
6189
6190 ssvpc = IXGBE_READ_REG(&adapter->hw, IXGBE_SSVPC);
6191
6192 /*
6193 * ssvpc register is cleared on read, if zero then no
6194 * spoofed packets in the last interval.
6195 */
6196 if (!ssvpc)
6197 return;
6198
6199 e_warn(drv, "%d Spoofed packets detected\n", ssvpc);
6200}
6201
6202/**
6203 * ixgbe_watchdog_subtask - check and bring link up
6204 * @adapter - pointer to the device adapter structure
6205 **/
6206static void ixgbe_watchdog_subtask(struct ixgbe_adapter *adapter)
6207{
6208 /* if interface is down do nothing */
6209 if (test_bit(__IXGBE_DOWN, &adapter->state))
6210 return;
6211
6212 ixgbe_watchdog_update_link(adapter);
6213
6214 if (adapter->link_up)
6215 ixgbe_watchdog_link_is_up(adapter);
6216 else
6217 ixgbe_watchdog_link_is_down(adapter);
6174 6218
6175 ixgbe_spoof_check(adapter); 6219 ixgbe_spoof_check(adapter);
6176 ixgbe_update_stats(adapter); 6220 ixgbe_update_stats(adapter);
6177 mutex_unlock(&ixgbe_watchdog_lock); 6221
6222 ixgbe_watchdog_flush_tx(adapter);
6178} 6223}
6179 6224
6180/** 6225/**
@@ -6308,6 +6353,8 @@ static void ixgbe_service_task(struct work_struct *work)
6308 6353
6309 ixgbe_sfp_detection_subtask(adapter); 6354 ixgbe_sfp_detection_subtask(adapter);
6310 ixgbe_sfp_link_config_subtask(adapter); 6355 ixgbe_sfp_link_config_subtask(adapter);
6356 ixgbe_watchdog_subtask(adapter);
6357 ixgbe_check_hang_subtask(adapter);
6311 6358
6312 ixgbe_service_event_complete(adapter); 6359 ixgbe_service_event_complete(adapter);
6313} 6360}
@@ -7485,12 +7532,8 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
7485 7532
7486 setup_timer(&adapter->service_timer, &ixgbe_service_timer, 7533 setup_timer(&adapter->service_timer, &ixgbe_service_timer,
7487 (unsigned long) adapter); 7534 (unsigned long) adapter);
7488 init_timer(&adapter->watchdog_timer);
7489 adapter->watchdog_timer.function = ixgbe_watchdog;
7490 adapter->watchdog_timer.data = (unsigned long)adapter;
7491 7535
7492 INIT_WORK(&adapter->reset_task, ixgbe_reset_task); 7536 INIT_WORK(&adapter->reset_task, ixgbe_reset_task);
7493 INIT_WORK(&adapter->watchdog_task, ixgbe_watchdog_task);
7494 7537
7495 INIT_WORK(&adapter->service_task, ixgbe_service_task); 7538 INIT_WORK(&adapter->service_task, ixgbe_service_task);
7496 clear_bit(__IXGBE_SERVICE_SCHED, &adapter->state); 7539 clear_bit(__IXGBE_SERVICE_SCHED, &adapter->state);
@@ -7643,13 +7686,6 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
7643 set_bit(__IXGBE_DOWN, &adapter->state); 7686 set_bit(__IXGBE_DOWN, &adapter->state);
7644 cancel_work_sync(&adapter->service_task); 7687 cancel_work_sync(&adapter->service_task);
7645 7688
7646 /*
7647 * The timers may be rescheduled, so explicitly disable them
7648 * from being rescheduled.
7649 */
7650 del_timer_sync(&adapter->watchdog_timer);
7651
7652 cancel_work_sync(&adapter->watchdog_task);
7653 if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || 7689 if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
7654 adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) 7690 adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
7655 cancel_work_sync(&adapter->fdir_reinit_task); 7691 cancel_work_sync(&adapter->fdir_reinit_task);