From nobody Fri Jun 20 13:52:38 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bNzSR3hx9z5y4Rs; Fri, 20 Jun 2025 13:52:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bNzSR04Tyz3YGK; Fri, 20 Jun 2025 13:52:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750427559; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=n0lRvC/SjX2OxLjlDUTUSeAfDxto7N7LrjTlBTyfOhE=; b=ooDB8qFhW6u4KjmHqgXKC+Tgmra4S4OHDKhmG2GjZlY5nSWP3wxDxhxwQiApUndAEaU4dS zmC5FUU9uY3zUbgHMYQx6/x/4R4tyYJOn4VBbrNkYJjsjhA/5p6BfiujFQt0itdVj//mI7 3qwJMYzde1aUWvYqPRDCpBKU6n5HShicDfo9QGOTIebcbJR2fWekepJRlnaLVl/SxFo3Jc zDLq8sQp1vTaJGuNp5HtU9OzNW9fILm01jweaUwJ0NNfjxz/LQDtIlezpAkrXOK9L14g2o Uj0aYM1uIIqSBG3IpuBfwh676wQmG95UQ00hUldtShjxqPkOPJPt+2DFpluO2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750427559; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=n0lRvC/SjX2OxLjlDUTUSeAfDxto7N7LrjTlBTyfOhE=; b=tNdcYe2ut0dBffHL/v2o3tg9HUZSM4MdV0rMJ3JcxtZGaBByZC5U+NGtl6OGz5LYnGefNC DfZZPiu/ve3Vl3aQe98CJpiDL6Tx26Jt1lQw/IvtLFLBj9qc6km63IAgQUdYei3QSQls68 WxrAkxkpE4zeYdBbTP47soNhVan03TYeV/AszWs7hyq1ciXaW2q/ocQyj4ltfzwZu1cJXf o6TqLEQX8mFFRbXSOsd7w0B/M8AijeSTNHyyX0bsLGZ4QGxyeW7XIi4xSQWHc9Wh8Dc3oX 0gd6fkUv7TtkGresyX4r7QbqiRitl09d5cRp6EVA1PiZ06ARGa/ycp3KzltBZA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1750427559; a=rsa-sha256; cv=none; b=iDrT8MR89c0Hv2x+o7g4fSnA+riAzSjlhuW8Mwtv8OtnM5B6dlrYjpURxocsc/Tyz1qWOV V0MuWWTDCYwkt8Pjo7nxe9doW+/qmoCo1AzQkLTB5GIsGWX3QC8PRRW2jPVMXGz2NP/i0X Mv4dQv9sLQrk6jA+8KzvXUNr1tcFEQpznH2ShceVPYEHk7KqrHnEEosxKeCMSd4W1mM6mO eowOLdoQYBD/95UxpB/SPaWvi0kEsNoytXppuDKIvayiKRN7qobJ+Y8FhF8fJorpprjRvD DrhYqwGg0HSxPHnWeKMDbPnikDJPvUmF69h1sG1ajtWNlkqK5E3F4XLxCu4uiA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bNzSQ6cjrznCy; Fri, 20 Jun 2025 13:52:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 55KDqcBc058553; Fri, 20 Jun 2025 13:52:38 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 55KDqcge058549; Fri, 20 Jun 2025 13:52:38 GMT (envelope-from git) Date: Fri, 20 Jun 2025 13:52:38 GMT Message-Id: <202506201352.55KDqcge058549@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: a66d631a385e - stable/14 - qat: refactor error handling and add mutex locks List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: a66d631a385ea35db9f3b31cecc355725a16022d Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=a66d631a385ea35db9f3b31cecc355725a16022d commit a66d631a385ea35db9f3b31cecc355725a16022d Author: Hareshx Sankar Raj AuthorDate: 2025-05-07 09:32:10 +0000 Commit: Mark Johnston CommitDate: 2025-06-20 12:47:28 +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 (cherry picked from commit ae1dc27639c88038d150660c4096753e210aec42) --- 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; }