u16 msg_enable;
        char misc_int_name[IFNAMSIZ + 9];
        u16 adminq_work_limit; /* num of admin receive queue desc to process */
-       int service_timer_period;
+       unsigned long service_timer_period;
+       unsigned long service_timer_previous;
        struct timer_list service_timer;
        struct work_struct service_task;
 
 
 }
 
 /**
- * i40e_watchdog_subtask - Check and bring link up
+ * i40e_watchdog_subtask - periodic checks not using event driven response
  * @pf: board private structure
  **/
 static void i40e_watchdog_subtask(struct i40e_pf *pf)
            test_bit(__I40E_CONFIG_BUSY, &pf->state))
                return;
 
+       /* make sure we don't do these things too often */
+       if (time_before(jiffies, (pf->service_timer_previous +
+                                 pf->service_timer_period)))
+               return;
+       pf->service_timer_previous = jiffies;
+
+       i40e_check_hang_subtask(pf);
+       i40e_link_event(pf);
+
        /* Update the stats for active netdevs so the network stack
         * can look at updated numbers whenever it cares to
         */
        i40e_vc_process_vflr_event(pf);
        i40e_watchdog_subtask(pf);
        i40e_fdir_reinit_subtask(pf);
-       i40e_check_hang_subtask(pf);
        i40e_sync_filters_subtask(pf);
 #ifdef CONFIG_I40E_VXLAN
        i40e_sync_vxlan_filters_subtask(pf);
 #endif
        i40e_clean_adminq_subtask(pf);
 
-       i40e_link_event(pf);
-
        i40e_service_event_complete(pf);
 
        /* If the tasks have taken longer than one timer cycle or there