scsi: qedf: Enable devlink support
authorJaved Hasan <jhasan@marvell.com>
Wed, 31 Mar 2021 16:49:16 +0000 (09:49 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Apr 2021 04:26:11 +0000 (00:26 -0400)
Devlink instance lifetime was linked to qed_dev object. That caused devlink
to be recreated on each recovery.

Change it by making higher level driver (qede) responsible for lifetime
management. This way devlink survives recoveries.

qede now stores devlink structure pointer as a part of its device object,
devlink private data contains a linkage structure, qed_devlink.

Link: https://lore.kernel.org/r/20210331164917.24662-2-jhasan@marvell.com
Signed-off-by: Javed Hasan <jhasan@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedf/qedf.h
drivers/scsi/qedf/qedf_main.c

index 0583b0707354b811e84b6bf6a7faeb1543e2e282..ba94413fe2ead1f1940e49dd8c4d9934eb2bbc89 100644 (file)
@@ -333,6 +333,7 @@ struct qedf_ctx {
        unsigned int curr_conn_id;
        struct workqueue_struct *ll2_recv_wq;
        struct workqueue_struct *link_update_wq;
+       struct devlink *devlink;
        struct delayed_work link_update;
        struct delayed_work link_recovery;
        struct completion flogi_compl;
index cec27f2ef70d7a87a9bbed4153c86439c05bfb4d..b8d016914eeef19857e56dd1e0c07b579300cfce 100644 (file)
@@ -3408,6 +3408,14 @@ retry_probe:
                goto err2;
        }
 
+       if (mode != QEDF_MODE_RECOVERY) {
+               qedf->devlink = qed_ops->common->devlink_register(qedf->cdev);
+               if (IS_ERR(qedf->devlink)) {
+                       QEDF_ERR(&qedf->dbg_ctx, "Cannot register devlink\n");
+                       qedf->devlink = NULL;
+               }
+       }
+
        /* Record BDQ producer doorbell addresses */
        qedf->bdq_primary_prod = qedf->dev_info.primary_dbq_rq_addr;
        qedf->bdq_secondary_prod = qedf->dev_info.secondary_bdq_rq_addr;
@@ -3789,6 +3797,11 @@ static void __qedf_remove(struct pci_dev *pdev, int mode)
                QEDF_ERR(&(qedf->dbg_ctx),
                        "Failed to send drv state to MFW.\n");
 
+       if (mode != QEDF_MODE_RECOVERY && qedf->devlink) {
+               qed_ops->common->devlink_unregister(qedf->devlink);
+               qedf->devlink = NULL;
+       }
+
        qed_ops->common->slowpath_stop(qedf->cdev);
        qed_ops->common->remove(qedf->cdev);