diff options
| author | jdolecek <jdolecek@NetBSD.org> | 2016-10-04 18:23:24 +0000 |
|---|---|---|
| committer | jdolecek <jdolecek@NetBSD.org> | 2016-10-04 18:23:24 +0000 |
| commit | 3fba6bfc5dfc7ac3c50fb2c4e65e598aba92e6db (patch) | |
| tree | 95e500abdc773a396f999f7b623788c7fb7e0ee9 /sys | |
| parent | 333cb1ebd64c6bd25a685181c33a80409d40f831 (diff) | |
react on ADAPTER_REQ_SET_XFER_MODE so that we set tagged queuing
pass tag type and set id
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/pci/vioscsi.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/sys/dev/pci/vioscsi.c b/sys/dev/pci/vioscsi.c index 28a2612d5f6..cfa24288929 100644 --- a/sys/dev/pci/vioscsi.c +++ b/sys/dev/pci/vioscsi.c @@ -1,4 +1,4 @@ -/* $NetBSD: vioscsi.c,v 1.7 2016/10/04 18:20:49 jdolecek Exp $ */ +/* $NetBSD: vioscsi.c,v 1.8 2016/10/04 18:23:24 jdolecek Exp $ */ /* $OpenBSD: vioscsi.c,v 1.3 2015/03/14 03:38:49 jsg Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.7 2016/10/04 18:20:49 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.8 2016/10/04 18:23:24 jdolecek Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -219,7 +219,19 @@ vioscsi_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t DPRINTF(("%s: enter\n", __func__)); - if (request != ADAPTER_REQ_RUN_XFER) { + switch (request) { + case ADAPTER_REQ_RUN_XFER: + break; + case ADAPTER_REQ_SET_XFER_MODE: + { + struct scsipi_xfer_mode *xm = arg; + xm->xm_mode = PERIPH_CAP_TQING; + xm->xm_period = 0; + xm->xm_offset = 0; + scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm); + return; + } + default: DPRINTF(("%s: unhandled %d\n", __func__, request)); return; } @@ -260,6 +272,29 @@ vioscsi_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t DPRINTF(("%s: command for %u:%u at slot %d\n", __func__, periph->periph_target - 1, periph->periph_lun, slot)); + /* tag */ + switch (XS_CTL_TAGTYPE(xs)) { + case XS_CTL_HEAD_TAG: + req->task_attr = VIRTIO_SCSI_S_HEAD; + break; + +#if 0 /* XXX */ + case XS_CTL_ACA_TAG: + req->task_attr = VIRTIO_SCSI_S_ACA; + break; +#endif + + case XS_CTL_ORDERED_TAG: + req->task_attr = VIRTIO_SCSI_S_ORDERED; + break; + + case XS_CTL_SIMPLE_TAG: + default: + req->task_attr = VIRTIO_SCSI_S_SIMPLE; + break; + } + req->id = (intptr_t)vr; + if ((size_t)xs->cmdlen > sizeof(req->cdb)) { DPRINTF(("%s: bad cmdlen %zu > %zu\n", __func__, (size_t)xs->cmdlen, sizeof(req->cdb))); |
