aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2020-10-25 19:34:02 +0000
committerAlexander Motin <mav@FreeBSD.org>2020-10-25 19:34:02 +0000
commit883649681528398dc227778882830fc9da0ce58c (patch)
treee723924a03b24e3f8e7969d4016ff5c79df76e94 /sys/dev
parent98b04ac35965fa0735c06a4966c6939f8009509e (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/iscsi/iscsi.c5
-rw-r--r--sys/dev/isp/isp.c4
-rw-r--r--sys/dev/isp/isp_freebsd.c2
-rw-r--r--sys/dev/isp/isp_freebsd.h3
-rw-r--r--sys/dev/isp/isp_stds.h3
-rw-r--r--sys/dev/isp/ispvar.h1
-rw-r--r--sys/dev/mpr/mpr_sas.c2
-rw-r--r--sys/dev/mps/mps_sas.c2
-rw-r--r--sys/dev/ocs_fc/ocs_cam.c33
-rw-r--r--sys/dev/ocs_fc/ocs_scsi.c34
-rw-r--r--sys/dev/ocs_fc/ocs_scsi.h11
-rw-r--r--sys/dev/ocs_fc/ocs_unsol.c1
12 files changed, 79 insertions, 22 deletions
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c
index c0fa3115d64a..466d4541dbc9 100644
--- a/sys/dev/iscsi/iscsi.c
+++ b/sys/dev/iscsi/iscsi.c
@@ -2299,6 +2299,11 @@ iscsi_action_scsiio(struct iscsi_session *is, union ccb *ccb)
} else
bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_UNTAGGED;
+ if (is->is_protocol_level >= 2) {
+ bhssc->bhssc_pri = (csio->priority << BHSSC_PRI_SHIFT) &
+ BHSSC_PRI_MASK;
+ }
+
bhssc->bhssc_lun = htobe64(CAM_EXTLUN_BYTE_SWIZZLE(ccb->ccb_h.target_lun));
bhssc->bhssc_initiator_task_tag = initiator_task_tag;
bhssc->bhssc_expected_data_transfer_length = htonl(csio->dxfer_len);
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index b81e3de28022..fe50aab77d43 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -4554,7 +4554,9 @@ isp_start(XS_T *xs)
} else {
ttype = FCP_CMND_TASK_ATTR_SIMPLE;
}
- ((ispreqt7_t *)reqp)->req_task_attribute = ttype;
+ ((ispreqt7_t *)reqp)->req_task_attribute = ttype |
+ ((XS_PRIORITY(xs) << FCP_CMND_PRIO_SHIFT) &
+ FCP_CMND_PRIO_MASK);
} else if (IS_FC(isp)) {
/*
* See comment in isp_intr_respq
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 3857d52bc0b0..f381f9f4f6f6 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -1917,6 +1917,8 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep)
atiop->tag_action = 0;
break;
}
+ atiop->priority = (aep->at_cmnd.fcp_cmnd_task_attribute &
+ FCP_CMND_PRIO_MASK) >> FCP_CMND_PRIO_SHIFT;
atp->orig_datalen = aep->at_cmnd.cdb_dl.sf.fcp_cmnd_dl;
atp->bytes_xfered = 0;
atp->lun = lun;
diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h
index 971fc0b05d84..a19c10e2b157 100644
--- a/sys/dev/isp/isp_freebsd.h
+++ b/sys/dev/isp/isp_freebsd.h
@@ -546,7 +546,8 @@ default: \
#define XS_TAG_TYPE(ccb) \
((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \
((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG))
-
+
+#define XS_PRIORITY(ccb) (ccb)->priority
#define XS_SETERR(ccb, v) (ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \
(ccb)->ccb_h.status |= v
diff --git a/sys/dev/isp/isp_stds.h b/sys/dev/isp/isp_stds.h
index 197962f2cee0..2dfea07cf55d 100644
--- a/sys/dev/isp/isp_stds.h
+++ b/sys/dev/isp/isp_stds.h
@@ -89,6 +89,9 @@ typedef struct {
#define FCP_CMND_TASK_ATTR_UNTAGGED 0x05
#define FCP_CMND_TASK_ATTR_MASK 0x07
+#define FCP_CMND_PRIO_MASK 0x78
+#define FCP_CMND_PRIO_SHIFT 3
+
#define FCP_CMND_ADDTL_CDBLEN_SHIFT 2
#define FCP_CMND_DATA_WRITE 0x01
diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h
index 45513a3b6871..5ff34e829eb3 100644
--- a/sys/dev/isp/ispvar.h
+++ b/sys/dev/isp/ispvar.h
@@ -1036,6 +1036,7 @@ void isp_async(ispsoftc_t *, ispasync_t, ...);
* XS_SNSASCQ(xs) dereferences XS_SNSP to get the current stored Additional Sense Code Qualifier
* XS_TAG_P(xs) predicate of whether this command should be tagged
* XS_TAG_TYPE(xs) which type of tag to use
+ * XS_PRIORITY(xs) command priority for SIMPLE tag
* XS_SETERR(xs) set error state
*
* HBA_NOERROR command has no erros
diff --git a/sys/dev/mpr/mpr_sas.c b/sys/dev/mpr/mpr_sas.c
index 400aa86e0fc0..de61ac7b8dd8 100644
--- a/sys/dev/mpr/mpr_sas.c
+++ b/sys/dev/mpr/mpr_sas.c
@@ -1997,6 +1997,8 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
break;
}
+ mpi_control |= (csio->priority << MPI2_SCSIIO_CONTROL_CMDPRI_SHIFT) &
+ MPI2_SCSIIO_CONTROL_CMDPRI_MASK;
mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits;
req->Control = htole32(mpi_control);
diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c
index e1e507590f49..97160a40ce08 100644
--- a/sys/dev/mps/mps_sas.c
+++ b/sys/dev/mps/mps_sas.c
@@ -1786,6 +1786,8 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
break;
}
+ mpi_control |= (csio->priority << MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT) &
+ MPI2_SCSIIO_CONTROL_TASKPRI_MASK;
mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits;
req->Control = htole32(mpi_control);
if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) {
diff --git a/sys/dev/ocs_fc/ocs_cam.c b/sys/dev/ocs_fc/ocs_cam.c
index e098997025c9..d3c275920c4b 100644
--- a/sys/dev/ocs_fc/ocs_cam.c
+++ b/sys/dev/ocs_fc/ocs_cam.c
@@ -580,8 +580,12 @@ int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint64_t lun, uint8_t *cdb,
atio->tag_action = MSG_HEAD_OF_Q_TAG;
else if (flags & OCS_SCSI_CMD_ORDERED)
atio->tag_action = MSG_ORDERED_Q_TAG;
+ else if (flags & OCS_SCSI_CMD_ACA)
+ atio->tag_action = MSG_ACA_TASK;
else
- atio->tag_action = 0;
+ atio->tag_action = CAM_TAG_ACTION_NONE;
+ atio->priority = (flags & OCS_SCSI_PRIORITY_MASK) >>
+ OCS_SCSI_PRIORITY_SHIFT;
atio->cdb_len = cdb_len;
ocs_memcpy(atio->cdb_io.cdb_bytes, cdb, cdb_len);
@@ -1782,7 +1786,7 @@ ocs_initiator_io(struct ocs_softc *ocs, union ccb *ccb)
ocs_node_t *node = NULL;
ocs_io_t *io = NULL;
ocs_scsi_sgl_t sgl[OCS_FC_MAX_SGL];
- int32_t sgl_count;
+ int32_t flags, sgl_count;
ocs_fcport *fcp;
fcp = FCPORT(ocs, cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path)));
@@ -1840,13 +1844,32 @@ ocs_initiator_io(struct ocs_softc *ocs, union ccb *ccb)
io->timeout = ccb->ccb_h.timeout;
}
+ switch (csio->tag_action) {
+ case MSG_HEAD_OF_Q_TAG:
+ flags = OCS_SCSI_CMD_HEAD_OF_QUEUE;
+ break;
+ case MSG_ORDERED_Q_TAG:
+ flags = OCS_SCSI_CMD_ORDERED;
+ break;
+ case MSG_ACA_TASK:
+ flags = OCS_SCSI_CMD_ACA;
+ break;
+ case CAM_TAG_ACTION_NONE:
+ case MSG_SIMPLE_Q_TAG:
+ default:
+ flags = OCS_SCSI_CMD_SIMPLE;
+ break;
+ }
+ flags |= (csio->priority << OCS_SCSI_PRIORITY_SHIFT) &
+ OCS_SCSI_PRIORITY_MASK;
+
switch (ccb->ccb_h.flags & CAM_DIR_MASK) {
case CAM_DIR_NONE:
rc = ocs_scsi_send_nodata_io(node, io, ccb_h->target_lun,
ccb->ccb_h.flags & CAM_CDB_POINTER ?
csio->cdb_io.cdb_ptr: csio->cdb_io.cdb_bytes,
csio->cdb_len,
- ocs_scsi_initiator_io_cb, ccb);
+ ocs_scsi_initiator_io_cb, ccb, flags);
break;
case CAM_DIR_IN:
rc = ocs_scsi_send_rd_io(node, io, ccb_h->target_lun,
@@ -1855,7 +1878,7 @@ ocs_initiator_io(struct ocs_softc *ocs, union ccb *ccb)
csio->cdb_len,
NULL,
sgl, sgl_count, csio->dxfer_len,
- ocs_scsi_initiator_io_cb, ccb);
+ ocs_scsi_initiator_io_cb, ccb, flags);
break;
case CAM_DIR_OUT:
rc = ocs_scsi_send_wr_io(node, io, ccb_h->target_lun,
@@ -1864,7 +1887,7 @@ ocs_initiator_io(struct ocs_softc *ocs, union ccb *ccb)
csio->cdb_len,
NULL,
sgl, sgl_count, csio->dxfer_len,
- ocs_scsi_initiator_io_cb, ccb);
+ ocs_scsi_initiator_io_cb, ccb, flags);
break;
default:
panic("%s invalid data direction %08x\n", __func__,
diff --git a/sys/dev/ocs_fc/ocs_scsi.c b/sys/dev/ocs_fc/ocs_scsi.c
index 1477771cc220..c2df898bda4b 100644
--- a/sys/dev/ocs_fc/ocs_scsi.c
+++ b/sys/dev/ocs_fc/ocs_scsi.c
@@ -297,7 +297,7 @@ ocs_scsi_send_io(ocs_hw_io_type_e type, ocs_node_t *node, ocs_io_t *io, uint64_t
ocs_scsi_tmf_cmd_e tmf, uint8_t *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
- ocs_scsi_rsp_io_cb_t cb, void *arg);
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
/**
* @brief Target response completion callback.
@@ -2263,12 +2263,12 @@ int32_t
ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len,
- ocs_scsi_rsp_io_cb_t cb, void *arg)
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags)
{
int32_t rc;
rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_READ, node, io, lun, 0, cdb, cdb_len, dif_info, sgl, sgl_count,
- wire_len, 0, cb, arg);
+ wire_len, 0, cb, arg, flags);
return rc;
}
@@ -2302,12 +2302,12 @@ ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uin
int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len,
- ocs_scsi_rsp_io_cb_t cb, void *arg)
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags)
{
int32_t rc;
rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_WRITE, node, io, lun, 0, cdb, cdb_len, dif_info, sgl, sgl_count,
- wire_len, 0, cb, arg);
+ wire_len, 0, cb, arg, flags);
return rc;
}
@@ -2343,12 +2343,12 @@ int32_t
ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
- ocs_scsi_rsp_io_cb_t cb, void *arg)
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags)
{
int32_t rc;
rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_WRITE, node, io, lun, 0, cdb, cdb_len, dif_info, sgl, sgl_count,
- wire_len, 0, cb, arg);
+ wire_len, 0, cb, arg, flags);
return rc;
}
@@ -2374,11 +2374,11 @@ ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint64_t lun, vo
* @return Returns 0 on success, or a negative error code value on failure.
*/
int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
- ocs_scsi_rsp_io_cb_t cb, void *arg)
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags)
{
int32_t rc;
- rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_NODATA, node, io, lun, 0, cdb, cdb_len, NULL, NULL, 0, 0, 0, cb, arg);
+ rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_NODATA, node, io, lun, 0, cdb, cdb_len, NULL, NULL, 0, 0, 0, cb, arg, flags);
return rc;
}
@@ -2444,7 +2444,7 @@ ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint64_
} else {
io->display_name = "tmf";
rc = ocs_scsi_send_io(OCS_HW_IO_INITIATOR_READ, node, io, lun, tmf, NULL, 0, NULL,
- sgl, sgl_count, len, 0, cb, arg);
+ sgl, sgl_count, len, 0, cb, arg, 0);
}
return rc;
@@ -2481,7 +2481,7 @@ static int32_t ocs_scsi_send_io(ocs_hw_io_type_e type, ocs_node_t *node, ocs_io_
ocs_scsi_tmf_cmd_e tmf, uint8_t *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
- ocs_scsi_rsp_io_cb_t cb, void *arg)
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags)
{
int32_t rc;
ocs_t *ocs;
@@ -2565,6 +2565,18 @@ static int32_t ocs_scsi_send_io(ocs_hw_io_type_e type, ocs_node_t *node, ocs_io_
return -1;
}
}
+ if (flags & OCS_SCSI_CMD_HEAD_OF_QUEUE)
+ cmnd->task_attribute = FCP_TASK_ATTR_HEAD_OF_QUEUE;
+ else if (flags & OCS_SCSI_CMD_ORDERED)
+ cmnd->task_attribute = FCP_TASK_ATTR_ORDERED;
+ else if (flags & OCS_SCSI_CMD_UNTAGGED)
+ cmnd->task_attribute = FCP_TASK_ATTR_UNTAGGED;
+ else if (flags & OCS_SCSI_CMD_ACA)
+ cmnd->task_attribute = FCP_TASK_ATTR_ACA;
+ else
+ cmnd->task_attribute = FCP_TASK_ATTR_SIMPLE;
+ cmnd->command_priority = (flags & OCS_SCSI_PRIORITY_MASK) >>
+ OCS_SCSI_PRIORITY_SHIFT;
switch (tmf) {
case OCS_SCSI_TMF_QUERY_TASK_SET:
diff --git a/sys/dev/ocs_fc/ocs_scsi.h b/sys/dev/ocs_fc/ocs_scsi.h
index aa4f96c070e6..9f5b8a935385 100644
--- a/sys/dev/ocs_fc/ocs_scsi.h
+++ b/sys/dev/ocs_fc/ocs_scsi.h
@@ -54,6 +54,8 @@
#define OCS_SCSI_CMD_ACA (1U << 6)
#define OCS_SCSI_FIRST_BURST_ERR (1U << 7)
#define OCS_SCSI_FIRST_BURST_ABORTED (1U << 8)
+#define OCS_SCSI_PRIORITY_MASK 0xf0000
+#define OCS_SCSI_PRIORITY_SHIFT 16
/* ocs_scsi_send_rd_data/recv_wr_data/send_resp flags */
#define OCS_SCSI_LAST_DATAPHASE (1U << 0)
@@ -347,17 +349,18 @@ extern int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_
extern int32_t ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
- ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
+ ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
extern int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
- ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
+ ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
extern int32_t ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
ocs_scsi_dif_info_t *dif_info,
ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
- ocs_scsi_rsp_io_cb_t cb, void *arg);
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
extern int32_t ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint64_t lun,
ocs_scsi_tmf_cmd_e tmf, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t len, ocs_scsi_rsp_io_cb_t cb, void *arg);
-extern int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
+extern int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
+ ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
extern void ocs_scsi_del_target_complete(ocs_node_t *node);
typedef enum {
diff --git a/sys/dev/ocs_fc/ocs_unsol.c b/sys/dev/ocs_fc/ocs_unsol.c
index cf2526f0721a..12b600132c00 100644
--- a/sys/dev/ocs_fc/ocs_unsol.c
+++ b/sys/dev/ocs_fc/ocs_unsol.c
@@ -854,6 +854,7 @@ ocs_get_flags_fcp_cmd(fcp_cmnd_iu_t *cmnd)
flags |= OCS_SCSI_CMD_UNTAGGED;
break;
}
+ flags |= (uint32_t)cmnd->command_priority << OCS_SCSI_PRIORITY_SHIFT;
if (cmnd->wrdata)
flags |= OCS_SCSI_CMD_DIR_IN;
if (cmnd->rddata)