Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jun 2025 13:57:10 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ae1dc27639c8 - main - qat: refactor error handling and add mutex locks
Message-ID:  <202506061357.556DvAUS084121@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=ae1dc27639c88038d150660c4096753e210aec42

commit ae1dc27639c88038d150660c4096753e210aec42
Author:     Hareshx Sankar Raj <hareshx.sankar.raj@intel.com>
AuthorDate: 2025-05-07 09:32:10 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-06-06 13:49:51 +0000

    qat: refactor error handling and add mutex locks
    
    Error handling in qat driver code has been refactored.
    Mutex lock handling has also been added during driver
    attach and detach. Also pci_disable_busmaster() is called in
    adf_detach() to ensure proper cleanup during device detachment.
    
    Reviewed by:    markj, ziaee
    MFC after:      2 weeks
    Sponsored by:   Intel Corporation
    Differential Revision:  https://reviews.freebsd.org/D50379
---
 sys/dev/qat/qat_common/adf_init.c         | 13 -------------
 sys/dev/qat/qat_hw/qat_200xx/adf_drv.c    | 23 +++++++++++++++++------
 sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c     | 23 +++++++++++++++++------
 sys/dev/qat/qat_hw/qat_4xxxvf/adf_drv.c   | 22 ++++++++++++++++++----
 sys/dev/qat/qat_hw/qat_c3xxx/adf_drv.c    | 23 +++++++++++++++++------
 sys/dev/qat/qat_hw/qat_c4xxx/adf_drv.c    | 23 +++++++++++++++++------
 sys/dev/qat/qat_hw/qat_c62x/adf_drv.c     | 23 +++++++++++++++++------
 sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c | 24 ++++++++++++++++++------
 8 files changed, 121 insertions(+), 53 deletions(-)

diff --git a/sys/dev/qat/qat_common/adf_init.c b/sys/dev/qat/qat_common/adf_init.c
index 6bd0d85aae69..a7ebb70dde3d 100644
--- a/sys/dev/qat/qat_common/adf_init.c
+++ b/sys/dev/qat/qat_common/adf_init.c
@@ -449,12 +449,6 @@ adf_dev_start_locked(struct adf_accel_dev *accel_dev)
 	struct list_head *list_itr;
 
 	set_bit(ADF_STATUS_STARTING, &accel_dev->status);
-	if (adf_devmgr_verify_id(&accel_dev->accel_id)) {
-		device_printf(GET_DEV(accel_dev),
-			      "QAT: Device %d not found\n",
-			      accel_dev->accel_id);
-		return ENODEV;
-	}
 	if (adf_ae_start(accel_dev)) {
 		device_printf(GET_DEV(accel_dev), "AE Start Failed\n");
 		return EFAULT;
@@ -556,13 +550,6 @@ adf_dev_stop_locked(struct adf_accel_dev *accel_dev)
 	struct service_hndl *service;
 	struct list_head *list_itr;
 
-	if (adf_devmgr_verify_id(&accel_dev->accel_id)) {
-		device_printf(GET_DEV(accel_dev),
-			      "QAT: Device %d not found\n",
-			      accel_dev->accel_id);
-		return ENODEV;
-	}
-
 	if (!test_bit(ADF_STATUS_CONFIGURED, &accel_dev->status))
 		return 0;
 
diff --git a/sys/dev/qat/qat_hw/qat_200xx/adf_drv.c b/sys/dev/qat/qat_hw/qat_200xx/adf_drv.c
index 9e2462c05657..816010dc06f8 100644
--- a/sys/dev/qat/qat_hw/qat_200xx/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_200xx/adf_drv.c
@@ -84,7 +84,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int i = 0, bar_nr = 0, reg_val = 0;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@@ -96,6 +96,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -108,9 +109,10 @@ adf_attach(device_t dev)
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called
 	 */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -213,18 +215,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -243,8 +247,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -260,7 +269,9 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 
 	return 0;
 }
diff --git a/sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c b/sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c
index 0813ccf5baf0..cb534dd03b86 100644
--- a/sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c
@@ -158,7 +158,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int bar_nr;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 512. Implemented to avoid the issue of
@@ -170,6 +170,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -180,9 +181,10 @@ adf_attach(device_t dev)
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called
 	 */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -273,18 +275,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -303,8 +307,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -320,7 +329,9 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 
 	return 0;
 }
diff --git a/sys/dev/qat/qat_hw/qat_4xxxvf/adf_drv.c b/sys/dev/qat/qat_hw/qat_4xxxvf/adf_drv.c
index 42189c28b21a..2bbccb4d6b17 100644
--- a/sys/dev/qat/qat_hw/qat_4xxxvf/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_4xxxvf/adf_drv.c
@@ -101,6 +101,7 @@ adf_attach(device_t dev)
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	accel_dev = device_get_softc(dev);
+	mutex_init(&accel_dev->lock);
 	accel_dev->is_vf = true;
 	pf = adf_devmgr_pci_to_accel_dev(pci_find_pf(dev));
 
@@ -112,11 +113,13 @@ adf_attach(device_t dev)
 		accel_pci_dev->node = 0;
 
 	/* Add accel device to accel table */
-	if (adf_devmgr_add_dev(accel_dev, pf)) {
+	ret = adf_devmgr_add_dev(accel_dev, pf);
+	if (ret) {
 		device_printf(GET_DEV(accel_dev),
 			      "Failed to add new accelerator device.\n");
-		return -EFAULT;
+		goto out_err_lock;
 	}
+
 	/* Allocate and configure device configuration structure */
 	hw_data = malloc(sizeof(*hw_data), M_QAT_4XXXVF, M_WAITOK | M_ZERO);
 	accel_dev->hw_device = hw_data;
@@ -152,6 +155,8 @@ adf_attach(device_t dev)
 				 NULL,
 				 NULL,
 				 &accel_dev->dma_tag);
+	if (ret)
+		goto out_err;
 
 	hw_data->accel_capabilities_mask = adf_4xxxvf_get_hw_cap(accel_dev);
 
@@ -180,7 +185,9 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
@@ -190,7 +197,7 @@ adf_attach(device_t dev)
 
 	ret = hw_data->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (!ret)
@@ -212,8 +219,13 @@ adf_attach(device_t dev)
 
 	return ret;
 
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -231,7 +243,9 @@ adf_detach(device_t dev)
 	clear_bit(ADF_STATUS_RESTARTING, &accel_dev->status);
 	adf_dev_stop(accel_dev);
 	adf_dev_shutdown(accel_dev);
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 	return 0;
 }
 
diff --git a/sys/dev/qat/qat_hw/qat_c3xxx/adf_drv.c b/sys/dev/qat/qat_hw/qat_c3xxx/adf_drv.c
index 9f2c9374e968..b91daefb45d4 100644
--- a/sys/dev/qat/qat_hw/qat_c3xxx/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_c3xxx/adf_drv.c
@@ -84,7 +84,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int i, bar_nr;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@@ -95,6 +95,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -106,9 +107,10 @@ adf_attach(device_t dev)
 
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -202,18 +204,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -232,8 +236,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -249,7 +258,9 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 
 	return 0;
 }
diff --git a/sys/dev/qat/qat_hw/qat_c4xxx/adf_drv.c b/sys/dev/qat/qat_hw/qat_c4xxx/adf_drv.c
index 697f5b1ce786..f333101cce50 100644
--- a/sys/dev/qat/qat_hw/qat_c4xxx/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_c4xxx/adf_drv.c
@@ -84,7 +84,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int i, bar_nr;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@@ -96,6 +96,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -108,9 +109,10 @@ adf_attach(device_t dev)
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called
 	 */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -201,18 +203,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_start(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -231,8 +235,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -248,7 +257,9 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 
 	return 0;
 }
diff --git a/sys/dev/qat/qat_hw/qat_c62x/adf_drv.c b/sys/dev/qat/qat_hw/qat_c62x/adf_drv.c
index 1d48b85b2e12..955f6c48a071 100644
--- a/sys/dev/qat/qat_hw/qat_c62x/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_c62x/adf_drv.c
@@ -84,7 +84,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int i, bar_nr;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@@ -95,6 +95,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -106,9 +107,10 @@ adf_attach(device_t dev)
 
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -203,18 +205,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -233,8 +237,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -250,7 +259,9 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
 
 	return 0;
 }
diff --git a/sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c b/sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c
index d8f2ba0a99b7..a74de5eb592d 100644
--- a/sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c
+++ b/sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c
@@ -84,7 +84,7 @@ adf_attach(device_t dev)
 	struct adf_accel_pci *accel_pci_dev;
 	struct adf_hw_device_data *hw_data;
 	unsigned int i, bar_nr;
-	int ret, rid;
+	int ret = 0, rid;
 	struct adf_cfg_device *cfg_dev = NULL;
 
 	/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@@ -95,6 +95,7 @@ adf_attach(device_t dev)
 
 	accel_dev = device_get_softc(dev);
 
+	mutex_init(&accel_dev->lock);
 	INIT_LIST_HEAD(&accel_dev->crypto_list);
 	accel_pci_dev = &accel_dev->accel_pci_dev;
 	accel_pci_dev->pci_dev = dev;
@@ -104,9 +105,10 @@ adf_attach(device_t dev)
 
 	/* Add accel device to accel table.
 	 * This should be called before adf_cleanup_accel is called */
-	if (adf_devmgr_add_dev(accel_dev, NULL)) {
+	ret = adf_devmgr_add_dev(accel_dev, NULL);
+	if (ret) {
 		device_printf(dev, "Failed to add new accelerator device.\n");
-		return ENXIO;
+		goto out_err_lock;
 	}
 
 	/* Allocate and configure device configuration structure */
@@ -191,18 +193,20 @@ adf_attach(device_t dev)
 		bar->base_addr = rman_get_start(bar->virt_addr);
 		bar->size = rman_get_size(bar->virt_addr);
 	}
-	pci_enable_busmaster(dev);
+	ret = pci_enable_busmaster(dev);
+	if (ret)
+		goto out_err;
 
 	adf_dbgfs_init(accel_dev);
 
 	if (!accel_dev->hw_device->config_device) {
 		ret = EFAULT;
-		goto out_err;
+		goto out_err_disable;
 	}
 
 	ret = accel_dev->hw_device->config_device(accel_dev);
 	if (ret)
-		goto out_err;
+		goto out_err_disable;
 
 	ret = adf_dev_init(accel_dev);
 	if (ret)
@@ -221,8 +225,13 @@ out_dev_stop:
 	adf_dev_stop(accel_dev);
 out_dev_shutdown:
 	adf_dev_shutdown(accel_dev);
+out_err_disable:
+	pci_disable_busmaster(dev);
 out_err:
 	adf_cleanup_accel(accel_dev);
+out_err_lock:
+	mutex_destroy(&accel_dev->lock);
+
 	return ret;
 }
 
@@ -238,7 +247,10 @@ adf_detach(device_t dev)
 
 	adf_dev_shutdown(accel_dev);
 
+	pci_disable_busmaster(dev);
 	adf_cleanup_accel(accel_dev);
+	mutex_destroy(&accel_dev->lock);
+
 	return 0;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202506061357.556DvAUS084121>