@@ -1795,15 +1795,6 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
1795
1795
/* initialize DCBNL interface */
1796
1796
fm10k_dcbnl_set_ops (netdev );
1797
1797
1798
- /* Initialize service timer and service task */
1799
- set_bit (__FM10K_SERVICE_DISABLE , & interface -> state );
1800
- setup_timer (& interface -> service_timer , & fm10k_service_timer ,
1801
- (unsigned long )interface );
1802
- INIT_WORK (& interface -> service_task , fm10k_service_task );
1803
-
1804
- /* kick off service timer now, even when interface is down */
1805
- mod_timer (& interface -> service_timer , (HZ * 2 ) + jiffies );
1806
-
1807
1798
/* Intitialize timestamp data */
1808
1799
fm10k_ts_init (interface );
1809
1800
@@ -1989,6 +1980,12 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1989
1980
if (err )
1990
1981
goto err_sw_init ;
1991
1982
1983
+ /* the mbx interrupt might attempt to schedule the service task, so we
1984
+ * must ensure it is disabled since we haven't yet requested the timer
1985
+ * or work item.
1986
+ */
1987
+ set_bit (__FM10K_SERVICE_DISABLE , & interface -> state );
1988
+
1992
1989
err = fm10k_mbx_request_irq (interface );
1993
1990
if (err )
1994
1991
goto err_mbx_interrupt ;
@@ -2008,6 +2005,16 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2008
2005
/* stop all the transmit queues from transmitting until link is up */
2009
2006
netif_tx_stop_all_queues (netdev );
2010
2007
2008
+ /* Initialize service timer and service task late in order to avoid
2009
+ * cleanup issues.
2010
+ */
2011
+ setup_timer (& interface -> service_timer , & fm10k_service_timer ,
2012
+ (unsigned long )interface );
2013
+ INIT_WORK (& interface -> service_task , fm10k_service_task );
2014
+
2015
+ /* kick off service timer now, even when interface is down */
2016
+ mod_timer (& interface -> service_timer , (HZ * 2 ) + jiffies );
2017
+
2011
2018
/* Register PTP interface */
2012
2019
fm10k_ptp_register (interface );
2013
2020
0 commit comments