Need to make sure the slowpath workqueue and the qede lock
are ready for the registration of the netdevice, as once
registered there's no guarantee those wouldn't be used.

Signed-off-by: Yuval Mintz <yuval.mi...@cavium.com>
---
 drivers/net/ethernet/qlogic/qede/qede_main.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c 
b/drivers/net/ethernet/qlogic/qede/qede_main.c
index d163e72..7a8e07d 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -854,6 +854,13 @@ static int __qede_probe(struct pci_dev *pdev, u32 
dp_module, u8 dp_level,
        if (rc)
                goto err3;
 
+       /* Prepare the lock prior to the registeration of the netdev,
+        * as once it's registered we might reach flows requiring it
+        * [it's even possible to reach a flow needing it directly
+        * from there, although it's unlikely].
+        */
+       INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
+       mutex_init(&edev->qede_lock);
        rc = register_netdev(edev->ndev);
        if (rc) {
                DP_NOTICE(edev, "Cannot register net-device\n");
@@ -878,8 +885,6 @@ static int __qede_probe(struct pci_dev *pdev, u32 
dp_module, u8 dp_level,
                qede_set_dcbnl_ops(edev->ndev);
 #endif
 
-       INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
-       mutex_init(&edev->qede_lock);
        edev->rx_copybreak = QEDE_RX_HDR_SIZE;
 
        DP_INFO(edev, "Ending successfully qede probe\n");
-- 
1.9.3

Reply via email to