aboutsummaryrefslogtreecommitdiff
path: root/lib/sg_pt_freebsd.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2017-11-27 13:48:00 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2017-11-27 13:48:00 +0000
commit0693a6de283a5802c480ff352b2933b87020cd42 (patch)
tree9f84e3e279514b332fe670836d5ca68215445c15 /lib/sg_pt_freebsd.c
parentcad489950e9fc29fe8786ddee2e163831abb3322 (diff)
downloadsg3_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.c58
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;
}