aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mpi3mr/mpi3mr_app.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mpi3mr/mpi3mr_app.c')
-rw-r--r--sys/dev/mpi3mr/mpi3mr_app.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/sys/dev/mpi3mr/mpi3mr_app.c b/sys/dev/mpi3mr/mpi3mr_app.c
index 7bd926269018..7e439bf7ed72 100644
--- a/sys/dev/mpi3mr/mpi3mr_app.c
+++ b/sys/dev/mpi3mr/mpi3mr_app.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2020-2023, Broadcom Inc. All rights reserved.
+ * Copyright (c) 2020-2025, Broadcom Inc. All rights reserved.
* Support: <fbsd-storage-driver.pdl@broadcom.com>
*
* Authors: Sumit Saxena <sumit.saxena@broadcom.com>
@@ -797,6 +797,8 @@ mpi3mr_app_mptcmds(struct cdev *dev, u_long cmd, void *uarg,
struct mpi3mr_ioctl_mpt_dma_buffer *dma_buffers = NULL, *dma_buff = NULL;
struct mpi3mr_ioctl_mpirepbuf *mpirepbuf = NULL;
struct mpi3mr_ioctl_mptcmd *karg = (struct mpi3mr_ioctl_mptcmd *)uarg;
+ struct mpi3mr_target *tgtdev = NULL;
+ Mpi3SCSITaskMgmtRequest_t *tm_req = NULL;
sc = mpi3mr_app_get_adp_instance(karg->mrioc_id);
@@ -1060,6 +1062,18 @@ mpi3mr_app_mptcmds(struct cdev *dev, u_long cmd, void *uarg,
}
}
+ if (mpi_header->Function == MPI3_FUNCTION_SCSI_TASK_MGMT) {
+ tm_req = (Mpi3SCSITaskMgmtRequest_t *)mpi_request;
+ if (tm_req->TaskType != MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
+ tgtdev = mpi3mr_find_target_by_dev_handle(sc->cam_sc, tm_req->DevHandle);
+ if (!tgtdev) {
+ rval = ENODEV;
+ goto out;
+ }
+ mpi3mr_atomic_inc(&tgtdev->block_io);
+ }
+ }
+
sc->ioctl_cmds.state = MPI3MR_CMD_PENDING;
sc->ioctl_cmds.is_waiting = 1;
sc->ioctl_cmds.callback = NULL;
@@ -1178,6 +1192,9 @@ mpi3mr_app_mptcmds(struct cdev *dev, u_long cmd, void *uarg,
sc->mpi3mr_aen_triggered = 0;
out_failed:
+ if (tgtdev)
+ mpi3mr_atomic_dec(&tgtdev->block_io);
+
sc->ioctl_cmds.is_senseprst = 0;
sc->ioctl_cmds.sensebuf = NULL;
sc->ioctl_cmds.state = MPI3MR_CMD_NOTUSED;
@@ -1641,6 +1658,18 @@ mpi3mr_pel_enable(struct mpi3mr_softc *sc,
struct mpi3mr_ioctl_pel_enable pel_enable;
mpi3mr_dprint(sc, MPI3MR_TRACE, "%s() line: %d\n", __func__, __LINE__);
+ if (sc->unrecoverable) {
+ device_printf(sc->mpi3mr_dev, "Issue IOCTL: controller is in unrecoverable state\n");
+ return EFAULT;
+ }
+ if (sc->reset_in_progress) {
+ device_printf(sc->mpi3mr_dev, "Issue IOCTL: reset in progress\n");
+ return EAGAIN;
+ }
+ if (sc->block_ioctls) {
+ device_printf(sc->mpi3mr_dev, "Issue IOCTL: IOCTLs are blocked\n");
+ return EAGAIN;
+ }
if ((data_out_sz != sizeof(pel_enable) ||
(pel_enable.pel_class > MPI3_PEL_CLASS_FAULT))) {
@@ -2067,7 +2096,7 @@ mpi3mr_get_adpinfo(struct mpi3mr_softc *sc,
adpinfo.pci_dev_hw_rev = pci_read_config(sc->mpi3mr_dev, PCIR_REVID, 1);
adpinfo.pci_subsys_dev_id = pci_get_subdevice(sc->mpi3mr_dev);
adpinfo.pci_subsys_ven_id = pci_get_subvendor(sc->mpi3mr_dev);
- adpinfo.pci_bus = pci_get_bus(sc->mpi3mr_dev);;
+ adpinfo.pci_bus = pci_get_bus(sc->mpi3mr_dev);
adpinfo.pci_dev = pci_get_slot(sc->mpi3mr_dev);
adpinfo.pci_func = pci_get_function(sc->mpi3mr_dev);
adpinfo.pci_seg_id = pci_get_domain(sc->mpi3mr_dev);