Devlink callbacks need access to device resources such as ptt lock, hence
performing the devlink registration after the device initialization.

Signed-off-by: Sudarsana Reddy Kalluru <skall...@marvell.com>
Signed-off-by: Ariel Elior <ael...@marvell.com>
---
 drivers/net/ethernet/qlogic/qed/qed_main.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c 
b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 829dd60..fdd84f5 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -472,22 +472,24 @@ static struct qed_dev *qed_probe(struct pci_dev *pdev,
        }
        DP_INFO(cdev, "PCI init completed successfully\n");
 
-       rc = qed_devlink_register(cdev);
+       rc = qed_hw_prepare(cdev, QED_PCI_DEFAULT);
        if (rc) {
-               DP_INFO(cdev, "Failed to register devlink.\n");
+               DP_ERR(cdev, "hw prepare failed\n");
                goto err2;
        }
 
-       rc = qed_hw_prepare(cdev, QED_PCI_DEFAULT);
+       rc = qed_devlink_register(cdev);
        if (rc) {
-               DP_ERR(cdev, "hw prepare failed\n");
-               goto err2;
+               DP_INFO(cdev, "Failed to register devlink.\n");
+               goto err3;
        }
 
        DP_INFO(cdev, "qed_probe completed successfully\n");
 
        return cdev;
 
+err3:
+       qed_hw_remove(cdev);
 err2:
        qed_free_pci(cdev);
 err1:
@@ -501,14 +503,14 @@ static void qed_remove(struct qed_dev *cdev)
        if (!cdev)
                return;
 
+       qed_devlink_unregister(cdev);
+
        qed_hw_remove(cdev);
 
        qed_free_pci(cdev);
 
        qed_set_power_state(cdev, PCI_D3hot);
 
-       qed_devlink_unregister(cdev);
-
        qed_free_cdev(cdev);
 }
 
-- 
1.8.3.1

Reply via email to