diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2017-11-27 13:48:00 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2017-11-27 13:48:00 +0000 |
commit | 0693a6de283a5802c480ff352b2933b87020cd42 (patch) | |
tree | 9f84e3e279514b332fe670836d5ca68215445c15 /lib/sg_pt_freebsd.c | |
parent | cad489950e9fc29fe8786ddee2e163831abb3322 (diff) | |
download | sg3_utils-0693a6de283a5802c480ff352b2933b87020cd42.tar.gz |
sg_lib: add SG_LIB_OS_BASE_ERR; sg_write_x: continue work
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@732 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib/sg_pt_freebsd.c')
-rw-r--r-- | lib/sg_pt_freebsd.c | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/lib/sg_pt_freebsd.c b/lib/sg_pt_freebsd.c index dc4f3c78..b0942712 100644 --- a/lib/sg_pt_freebsd.c +++ b/lib/sg_pt_freebsd.c @@ -69,6 +69,13 @@ struct sg_pt_freebsd_scsi { unsigned char * dxferp; int dxfer_len; int dxfer_dir; + unsigned char * dxferip; + unsigned char * dxferop; + unsigned char * mdxferp; + uint32_t dxfer_ilen; + uint32_t dxfer_olen; + uint32_t mdxfer_len; + bool mdxfer_out; int scsi_status; int resid; int sense_resid; @@ -76,7 +83,7 @@ struct sg_pt_freebsd_scsi { int os_err; int transport_err; int dev_han; // -1 if not provided - uint32_t result; // NVMe result from completion + uint32_t nvme_result; // from completion }; struct sg_pt_base { @@ -433,11 +440,13 @@ set_scsi_pt_data_in(struct sg_pt_base * vp, unsigned char * dxferp, { struct sg_pt_freebsd_scsi * ptp = &vp->impl; - if (ptp->dxferp) + if (ptp->dxferip) ++ptp->in_err; if (dxfer_len > 0) { ptp->dxferp = dxferp; + ptp->dxferip = dxferp; ptp->dxfer_len = dxfer_len; + ptp->dxfer_ilen = dxfer_len; ptp->dxfer_dir = CAM_DIR_IN; } } @@ -449,16 +458,33 @@ set_scsi_pt_data_out(struct sg_pt_base * vp, const unsigned char * dxferp, { struct sg_pt_freebsd_scsi * ptp = &vp->impl; - if (ptp->dxferp) + if (ptp->dxferop) ++ptp->in_err; if (dxfer_len > 0) { ptp->dxferp = (unsigned char *)dxferp; + ptp->dxferop = (unsigned char *)dxferp; ptp->dxfer_len = dxfer_len; + ptp->dxfer_olen = dxfer_len; ptp->dxfer_dir = CAM_DIR_OUT; } } void +set_pt_metadata_xfer(struct sg_pt_base * vp, unsigned char * mdxferp, + uint32_t mdxfer_len, bool out_true) +{ + struct sg_pt_freebsd_scsi * ptp = &vp->impl; + + if (ptp->mdxferp) + ++ptp->in_err; + if (mdxfer_len > 0) { + ptp->mdxferp = mdxferp; + ptp->mdxfer_len = mdxfer_len; + ptp->mdxfer_out = out_true; + } +} + +void set_scsi_pt_packet_id(struct sg_pt_base * vp __attribute__ ((unused)), int pack_id __attribute__ ((unused))) { @@ -589,7 +615,7 @@ do_scsi_pt(struct sg_pt_base * vp, int dev_han, int time_secs, int verbose) ptp->os_err); return -ptp->os_err; } - ptp->result = npc.cpl.cdw0; + ptp->nvme_result = npc.cpl.cdw0; if (ptp->sense_len > 0) { n = (int)sizeof(npc.cpl); n = ptp->sense_len < n ? ptp->sense_len : n; @@ -707,7 +733,27 @@ get_scsi_pt_status_response(const struct sg_pt_base * vp) fdchan = devicetable[han]; if (NULL == fdchan) return -1; - return fdchan->is_nvme ? (int)ptp->result : ptp->scsi_status; + return fdchan->is_nvme ? (int)ptp->nvme_result : ptp->scsi_status; + } + return -1; +} + +uint32_t +get_pt_result(const struct sg_pt_base * vp) +{ + const struct sg_pt_freebsd_scsi * ptp = &vp->impl; + + if (ptp) { + int han = ptp->dev_han - FREEBSD_FDOFFSET; + struct freebsd_dev_channel *fdchan; + + if ((han < 0) || (han >= FREEBSD_MAXDEV)) + return -1; + fdchan = devicetable[han]; + if (NULL == fdchan) + return -1; + return fdchan->is_nvme ? ptp->nvme_result : + (uint32_t)ptp->scsi_status; } return -1; } @@ -791,7 +837,7 @@ pt_device_is_nvme(const struct sg_pt_base * vp) errno = ENODEV; return false; } - return fdchan->is_nvme ; + return fdchan->is_nvme; } return false; } |