Lines Matching +full:no +full:- +full:verbose
2 * Copyright (c) 2005-2021 Douglas Gilbert.
4 * Use of this source code is governed by a BSD-style
7 * SPDX-License-Identifier: BSD-2-Clause
58 /* sg driver displayed format: [x]xyyzz --> [x]x.[y]y.zz */
99 * sg_io_linux.h N.B. the SUGGEST_* constants are no longer used.
126 * can be hot-plugged into system in which case it should be called
129 sg_find_bsg_nvme_char_major(int verbose) in sg_find_bsg_nvme_char_major() argument
141 if (verbose) in sg_find_bsg_nvme_char_major()
166 if (verbose > 3) { in sg_find_bsg_nvme_char_major()
173 pr2ws("found no bsg not nvme char device in %s\n", proc_devices); in sg_find_bsg_nvme_char_major()
179 * true if dev_fd is a scsi generic pass-through device. If yields
185 int verbose) in check_file_type() argument
198 if (verbose) in check_file_type()
203 major_num = (int)SG_DEV_MAJOR(dev_statp->st_rdev); in check_file_type()
204 if (S_ISCHR(dev_statp->st_mode)) { in check_file_type()
211 } else if (S_ISBLK(dev_statp->st_mode)) { in check_file_type()
218 if (verbose) in check_file_type()
228 if (verbose) in check_file_type()
232 if (verbose > 3) { in check_file_type()
242 ((uint32_t)-1 == nsid) ? -1LL : (long long)nsid); in check_file_type()
261 * a SCSI or NVMe pass-through is referenced, then it might guess based on
262 * device_name. Returns 1 if SCSI generic pass-though device, returns 2 if
263 * secondary SCSI pass-through device (in Linux a bsg device); returns 3 is
264 * char NVMe device (i.e. no NSID); returns 4 if block NVMe device (includes
268 check_pt_file_handle(int dev_fd, const char * device_name, int verbose) in check_pt_file_handle() argument
270 if (verbose > 4) in check_pt_file_handle()
273 /* Linux doesn't need device_name to determine which pass-through */ in check_pt_file_handle()
276 sg_find_bsg_nvme_char_major(verbose); in check_pt_file_handle()
285 &err, verbose); in check_pt_file_handle()
287 return -err; in check_pt_file_handle()
334 /* Similar to scsi_pt_open_device() but takes Unix style open flags OR-ed */
338 scsi_pt_open_flags(const char * device_name, int flags, int verbose) in scsi_pt_open_flags() argument
344 sg_find_bsg_nvme_char_major(verbose); in scsi_pt_open_flags()
346 if (verbose > 1) { in scsi_pt_open_flags()
351 fd = -errno; in scsi_pt_open_flags()
352 if (verbose > 1) in scsi_pt_open_flags()
354 flags, safe_strerror(-fd)); in scsi_pt_open_flags()
361 scsi_pt_open_device(const char * device_name, bool read_only, int verbose) in scsi_pt_open_device() argument
366 return scsi_pt_open_flags(device_name, oflags, verbose); in scsi_pt_open_device()
377 res = -errno; in scsi_pt_close_device()
389 construct_scsi_pt_obj_with_fd(int dev_fd, int verbose) in construct_scsi_pt_obj_with_fd() argument
399 sntl_init_dev_stat(&ptp->dev_stat); in construct_scsi_pt_obj_with_fd()
404 ptp->dev_stat.scsi_dsense = ev_dsense; in construct_scsi_pt_obj_with_fd()
406 err = set_pt_file_handle((struct sg_pt_base *)ptp, dev_fd, verbose); in construct_scsi_pt_obj_with_fd()
407 if ((0 == err) && (! ptp->is_nvme)) { in construct_scsi_pt_obj_with_fd()
408 ptp->io_hdr.guard = 'Q'; in construct_scsi_pt_obj_with_fd()
410 ptp->io_hdr.protocol = BSG_PROTOCOL_SCSI; in construct_scsi_pt_obj_with_fd()
413 ptp->io_hdr.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD; in construct_scsi_pt_obj_with_fd()
416 } else if (verbose) in construct_scsi_pt_obj_with_fd()
425 return construct_scsi_pt_obj_with_fd(-1 /* dev_fd */, 0 /* verbose */); in construct_scsi_pt_obj()
435 struct sg_pt_linux_scsi * ptp = &vp->impl; in destruct_scsi_pt_obj()
437 if (ptp->free_nvme_id_ctlp) { in destruct_scsi_pt_obj()
438 free(ptp->free_nvme_id_ctlp); in destruct_scsi_pt_obj()
439 ptp->free_nvme_id_ctlp = NULL; in destruct_scsi_pt_obj()
440 ptp->nvme_id_ctlp = NULL; in destruct_scsi_pt_obj()
451 struct sg_pt_linux_scsi * ptp = &vp->impl; in clear_scsi_pt_obj()
459 fd = ptp->dev_fd; in clear_scsi_pt_obj()
460 is_sg = ptp->is_sg; in clear_scsi_pt_obj()
461 is_bsg = ptp->is_bsg; in clear_scsi_pt_obj()
462 is_nvme = ptp->is_nvme; in clear_scsi_pt_obj()
463 nvme_nsid = ptp->nvme_nsid; in clear_scsi_pt_obj()
464 dev_stat = ptp->dev_stat; in clear_scsi_pt_obj()
465 if (ptp->free_nvme_id_ctlp) in clear_scsi_pt_obj()
466 free(ptp->free_nvme_id_ctlp); in clear_scsi_pt_obj()
468 ptp->io_hdr.guard = 'Q'; in clear_scsi_pt_obj()
470 ptp->io_hdr.protocol = BSG_PROTOCOL_SCSI; in clear_scsi_pt_obj()
473 ptp->io_hdr.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD; in clear_scsi_pt_obj()
475 ptp->dev_fd = fd; in clear_scsi_pt_obj()
476 ptp->is_sg = is_sg; in clear_scsi_pt_obj()
477 ptp->is_bsg = is_bsg; in clear_scsi_pt_obj()
478 ptp->is_nvme = is_nvme; in clear_scsi_pt_obj()
479 ptp->nvme_our_sntl = false; in clear_scsi_pt_obj()
480 ptp->nvme_nsid = nvme_nsid; in clear_scsi_pt_obj()
481 ptp->dev_stat = dev_stat; in clear_scsi_pt_obj()
488 struct sg_pt_linux_scsi * ptp = &vp->impl; in partial_clear_scsi_pt_obj()
492 ptp->in_err = 0; in partial_clear_scsi_pt_obj()
493 ptp->os_err = 0; in partial_clear_scsi_pt_obj()
494 ptp->io_hdr.device_status = 0; in partial_clear_scsi_pt_obj()
495 ptp->io_hdr.transport_status = 0; in partial_clear_scsi_pt_obj()
496 ptp->io_hdr.driver_status = 0; in partial_clear_scsi_pt_obj()
497 ptp->io_hdr.din_xferp = 0; in partial_clear_scsi_pt_obj()
498 ptp->io_hdr.din_xfer_len = 0; in partial_clear_scsi_pt_obj()
499 ptp->io_hdr.dout_xferp = 0; in partial_clear_scsi_pt_obj()
500 ptp->io_hdr.dout_xfer_len = 0; in partial_clear_scsi_pt_obj()
501 ptp->nvme_result = 0; in partial_clear_scsi_pt_obj()
508 uint32_t sei_wr_mask; /* OR-ed SG_SEIM_* user->driver values */
509 uint32_t sei_rd_mask; /* OR-ed SG_SEIM_* driver->user values */
510 uint32_t ctl_flags_wr_mask; /* OR-ed SG_CTL_FLAGM_* values */
511 uint32_t ctl_flags_rd_mask; /* OR-ed SG_CTL_FLAGM_* values */
512 uint32_t ctl_flags; /* bit values OR-ed, see SG_CTL_FLAGM_* */
515 uint32_t reserved_sz; /* data/sgl size of pre-allocated request */
516 uint32_t tot_fd_thresh; /* total data/sgat for this fd, 0: no limit */
535 * find file type (e.g. if pass-though) from OS so there could be an error.
537 * will return. dev_fd should be >= 0 for a valid file handle or -1 . */
539 set_pt_file_handle(struct sg_pt_base * vp, int dev_fd, int verbose) in set_pt_file_handle() argument
541 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_pt_file_handle()
546 sg_find_bsg_nvme_char_major(verbose); in set_pt_file_handle()
548 ptp->dev_fd = dev_fd; in set_pt_file_handle()
550 ptp->is_sg = check_file_type(dev_fd, &a_stat, &ptp->is_bsg, in set_pt_file_handle()
551 &ptp->is_nvme, &ptp->nvme_nsid, in set_pt_file_handle()
552 &ptp->os_err, verbose); in set_pt_file_handle()
553 if (ptp->is_sg && (! sg_checked_version_num)) { in set_pt_file_handle()
554 if (ioctl(dev_fd, SG_GET_VERSION_NUM, &ptp->sg_version) < 0) { in set_pt_file_handle()
555 ptp->sg_version = 0; in set_pt_file_handle()
556 if (verbose > 3) in set_pt_file_handle()
560 sg_driver_version_num = ptp->sg_version; in set_pt_file_handle()
563 if (verbose > 4) { in set_pt_file_handle()
564 int ver = ptp->sg_version; in set_pt_file_handle()
566 if (ptp->sg_version >= SG_LINUX_SG_VER_V4_BASE) { in set_pt_file_handle()
576 } else if (verbose > 5) in set_pt_file_handle()
581 } else if (ptp->is_sg) in set_pt_file_handle()
582 ptp->sg_version = sg_driver_version_num; in set_pt_file_handle()
584 if (ptp->is_sg && (ptp->sg_version >= SG_LINUX_SG_VER_V4_FULL) && in set_pt_file_handle()
591 seip->sei_wr_mask |= SG_SEIM_CTL_FLAGS; in set_pt_file_handle()
592 seip->ctl_flags_wr_mask |= SG_CTL_FLAGM_TIME_IN_NS; in set_pt_file_handle()
593 seip->ctl_flags |= SG_CTL_FLAGM_TIME_IN_NS; in set_pt_file_handle()
595 if (verbose > 2) in set_pt_file_handle()
596 pr2ws("%s: unable to override milli --> nanoseconds: " in set_pt_file_handle()
601 if (verbose > 5) in set_pt_file_handle()
605 } else if (ptp->is_sg && (ptp->sg_version >= SG_LINUX_SG_VER_V4_BASE) in set_pt_file_handle()
607 if (verbose > 2) in set_pt_file_handle()
612 ptp->is_sg = false; in set_pt_file_handle()
613 ptp->is_bsg = false; in set_pt_file_handle()
614 ptp->is_nvme = false; in set_pt_file_handle()
615 ptp->nvme_our_sntl = false; in set_pt_file_handle()
616 ptp->nvme_nsid = 0; in set_pt_file_handle()
617 ptp->os_err = 0; in set_pt_file_handle()
619 return ptp->os_err; in set_pt_file_handle()
625 const struct sg_pt_linux_scsi * ptp = &vp->impl; in sg_linux_get_sg_version()
627 return ptp->sg_version; in sg_linux_get_sg_version()
630 /* Valid file handles (which is the return value) are >= 0 . Returns -1
631 * if there is no valid file handle. */
635 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_file_handle()
637 return ptp->dev_fd; in get_pt_file_handle()
644 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_cdb()
646 ptp->io_hdr.request = (__u64)(sg_uintptr_t)cdb; in set_scsi_pt_cdb()
647 ptp->io_hdr.request_len = cdb_len; in set_scsi_pt_cdb()
653 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_cdb_len()
655 return ptp->io_hdr.request_len; in get_scsi_pt_cdb_len()
661 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_cdb_buf()
663 return (uint8_t *)(sg_uintptr_t)ptp->io_hdr.request; in get_scsi_pt_cdb_buf()
670 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_sense()
676 ptp->io_hdr.response = (__u64)(sg_uintptr_t)sense; in set_scsi_pt_sense()
677 ptp->io_hdr.max_response_len = max_sense_len; in set_scsi_pt_sense()
685 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_data_in()
687 if (ptp->io_hdr.din_xferp) in set_scsi_pt_data_in()
688 ++ptp->in_err; in set_scsi_pt_data_in()
690 ptp->io_hdr.din_xferp = (__u64)(sg_uintptr_t)dxferp; in set_scsi_pt_data_in()
691 ptp->io_hdr.din_xfer_len = dxfer_ilen; in set_scsi_pt_data_in()
700 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_data_out()
702 if (ptp->io_hdr.dout_xferp) in set_scsi_pt_data_out()
703 ++ptp->in_err; in set_scsi_pt_data_out()
705 ptp->io_hdr.dout_xferp = (__u64)(sg_uintptr_t)dxferp; in set_scsi_pt_data_out()
706 ptp->io_hdr.dout_xfer_len = dxfer_olen; in set_scsi_pt_data_out()
714 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_pt_metadata_xfer()
717 ptp->mdxferp = dxferp; in set_pt_metadata_xfer()
718 ptp->mdxfer_len = dxfer_len; in set_pt_metadata_xfer()
719 ptp->mdxfer_out = out_true; in set_pt_metadata_xfer()
726 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_packet_id()
728 ptp->io_hdr.request_extra = pack_id; /* was placed in spare_in */ in set_scsi_pt_packet_id()
734 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_tag()
736 ptp->io_hdr.request_tag = tag; in set_scsi_pt_tag()
743 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_task_management()
745 ptp->io_hdr.subprotocol = 1; /* SCSI task management function */ in set_scsi_pt_task_management()
746 ptp->tmf_request[0] = (uint8_t)tmf_code; /* assume it fits */ in set_scsi_pt_task_management()
747 ptp->io_hdr.request = (__u64)(sg_uintptr_t)(&(ptp->tmf_request[0])); in set_scsi_pt_task_management()
748 ptp->io_hdr.request_len = 1; in set_scsi_pt_task_management()
754 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_task_attr()
756 ptp->io_hdr.request_attr = attribute; in set_scsi_pt_task_attr()
757 ptp->io_hdr.request_priority = priority; in set_scsi_pt_task_attr()
778 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_flags()
783 ptp->io_hdr.flags |= BSG_FLAG_Q_AT_HEAD; in set_scsi_pt_flags()
784 ptp->io_hdr.flags &= ~BSG_FLAG_Q_AT_TAIL; in set_scsi_pt_flags()
786 ptp->io_hdr.flags |= BSG_FLAG_Q_AT_TAIL; in set_scsi_pt_flags()
787 ptp->io_hdr.flags &= ~BSG_FLAG_Q_AT_HEAD; in set_scsi_pt_flags()
792 * number actually transferred. This it typically important for data-in
793 * transfers. For data-out (only) transfers, the 'dout_req_len -
800 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_resid()
802 if ((NULL == ptp) || (ptp->is_nvme && ! ptp->nvme_our_sntl)) in get_scsi_pt_resid()
804 else if ((ptp->io_hdr.din_xfer_len > 0) && in get_scsi_pt_resid()
805 (ptp->io_hdr.dout_xfer_len > 0)) in get_scsi_pt_resid()
806 return ptp->io_hdr.din_resid; in get_scsi_pt_resid()
807 else if (ptp->io_hdr.dout_xfer_len > 0) in get_scsi_pt_resid()
808 return ptp->io_hdr.dout_resid; in get_scsi_pt_resid()
809 return ptp->io_hdr.din_resid; in get_scsi_pt_resid()
816 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_req_lengths()
819 if (ptp->io_hdr.din_xfer_len > 0) in get_pt_req_lengths()
820 *req_dinp = ptp->io_hdr.din_xfer_len; in get_pt_req_lengths()
825 if (ptp->io_hdr.dout_xfer_len > 0) in get_pt_req_lengths()
826 *req_doutp = ptp->io_hdr.dout_xfer_len; in get_pt_req_lengths()
836 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_actual_lengths()
839 if (ptp->io_hdr.din_xfer_len > 0) { in get_pt_actual_lengths()
840 int res = ptp->io_hdr.din_xfer_len - ptp->io_hdr.din_resid; in get_pt_actual_lengths()
847 if (ptp->io_hdr.dout_xfer_len > 0) in get_pt_actual_lengths()
848 *act_doutp = ptp->io_hdr.dout_xfer_len - ptp->io_hdr.dout_resid; in get_pt_actual_lengths()
857 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_status_response()
861 return (int)((ptp->is_nvme && ! ptp->nvme_our_sntl) ? in get_scsi_pt_status_response()
862 ptp->nvme_status : ptp->io_hdr.device_status); in get_scsi_pt_status_response()
868 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_result()
872 return (ptp->is_nvme && ! ptp->nvme_our_sntl) ? in get_pt_result()
873 ptp->nvme_result : ptp->io_hdr.device_status; in get_pt_result()
879 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_sense_len()
881 return ptp->io_hdr.response_len; in get_scsi_pt_sense_len()
887 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_sense_buf()
889 return (uint8_t *)(sg_uintptr_t)ptp->io_hdr.response; in get_scsi_pt_sense_buf()
895 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_duration_ms()
897 return sg_duration_set_nano ? (ptp->io_hdr.duration / 1000) : in get_scsi_pt_duration_ms()
898 ptp->io_hdr.duration; in get_scsi_pt_duration_ms()
906 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_duration_ns()
908 return sg_duration_set_nano ? (uint32_t)ptp->io_hdr.duration : 0; in get_pt_duration_ns()
914 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_transport_err()
916 return ptp->io_hdr.transport_status; in get_scsi_pt_transport_err()
922 struct sg_pt_linux_scsi * ptp = &vp->impl; in set_scsi_pt_transport_err()
924 ptp->io_hdr.transport_status = err; in set_scsi_pt_transport_err()
934 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_transport_err_str()
935 int ds = ptp->io_hdr.driver_status; in get_scsi_pt_transport_err_str()
936 int hs = ptp->io_hdr.transport_status; in get_scsi_pt_transport_err_str()
953 m -= n; in get_scsi_pt_transport_err_str()
955 b[max_b_len - 1] = '\0'; in get_scsi_pt_transport_err_str()
964 m -= n; in get_scsi_pt_transport_err_str()
967 b[max_b_len - 1] = '\0'; in get_scsi_pt_transport_err_str()
974 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_result_category()
975 int dr_st = ptp->io_hdr.driver_status & SG_LIB_DRIVER_MASK; in get_scsi_pt_result_category()
976 int scsi_st = ptp->io_hdr.device_status & 0x7e; in get_scsi_pt_result_category()
978 if (ptp->os_err) in get_scsi_pt_result_category()
980 else if (ptp->io_hdr.transport_status) in get_scsi_pt_result_category()
997 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_os_err()
999 return ptp->os_err; in get_scsi_pt_os_err()
1005 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_scsi_pt_os_err_str()
1008 cp = safe_strerror(ptp->os_err); in get_scsi_pt_os_err_str()
1011 b[max_b_len - 1] = '\0'; in get_scsi_pt_os_err_str()
1018 const struct sg_pt_linux_scsi * ptp = &vp->impl; in pt_device_is_nvme()
1020 return ptp->is_nvme; in pt_device_is_nvme()
1029 const struct sg_pt_linux_scsi * ptp = &vp->impl; in get_pt_nvme_nsid()
1031 return ptp->nvme_nsid; in get_pt_nvme_nsid()
1037 int verbose) in do_scsi_pt_v3() argument
1045 v3_hdr.cmdp = (uint8_t *)(sg_uintptr_t)ptp->io_hdr.request; in do_scsi_pt_v3()
1046 v3_hdr.cmd_len = (uint8_t)ptp->io_hdr.request_len; in do_scsi_pt_v3()
1047 if (ptp->io_hdr.din_xfer_len > 0) { in do_scsi_pt_v3()
1048 if (ptp->io_hdr.dout_xfer_len > 0) { in do_scsi_pt_v3()
1049 if (verbose) in do_scsi_pt_v3()
1053 v3_hdr.dxferp = (void *)(long)ptp->io_hdr.din_xferp; in do_scsi_pt_v3()
1054 v3_hdr.dxfer_len = (unsigned int)ptp->io_hdr.din_xfer_len; in do_scsi_pt_v3()
1056 } else if (ptp->io_hdr.dout_xfer_len > 0) { in do_scsi_pt_v3()
1057 v3_hdr.dxferp = (void *)(long)ptp->io_hdr.dout_xferp; in do_scsi_pt_v3()
1058 v3_hdr.dxfer_len = (unsigned int)ptp->io_hdr.dout_xfer_len; in do_scsi_pt_v3()
1061 if (ptp->io_hdr.response && (ptp->io_hdr.max_response_len > 0)) { in do_scsi_pt_v3()
1062 v3_hdr.sbp = (uint8_t *)(sg_uintptr_t)ptp->io_hdr.response; in do_scsi_pt_v3()
1063 v3_hdr.mx_sb_len = (uint8_t)ptp->io_hdr.max_response_len; in do_scsi_pt_v3()
1065 v3_hdr.pack_id = (int)ptp->io_hdr.request_extra; in do_scsi_pt_v3()
1066 if (BSG_FLAG_Q_AT_HEAD & ptp->io_hdr.flags) in do_scsi_pt_v3()
1068 else if (BSG_FLAG_Q_AT_TAIL & ptp->io_hdr.flags) in do_scsi_pt_v3()
1072 if (verbose) in do_scsi_pt_v3()
1073 pr2ws("No SCSI command (cdb) given [v3]\n"); in do_scsi_pt_v3()
1080 ptp->os_err = errno; in do_scsi_pt_v3()
1081 if (verbose > 1) in do_scsi_pt_v3()
1083 safe_strerror(ptp->os_err), ptp->os_err); in do_scsi_pt_v3()
1084 return -ptp->os_err; in do_scsi_pt_v3()
1086 ptp->io_hdr.device_status = (__u32)v3_hdr.status; in do_scsi_pt_v3()
1087 ptp->io_hdr.driver_status = (__u32)v3_hdr.driver_status; in do_scsi_pt_v3()
1088 ptp->io_hdr.transport_status = (__u32)v3_hdr.host_status; in do_scsi_pt_v3()
1089 ptp->io_hdr.response_len = (__u32)v3_hdr.sb_len_wr; in do_scsi_pt_v3()
1090 ptp->io_hdr.duration = (__u32)v3_hdr.duration; in do_scsi_pt_v3()
1091 ptp->io_hdr.din_resid = (__s32)v3_hdr.resid; in do_scsi_pt_v3()
1092 /* v3_hdr.info not passed back since no mapping defined (yet) */ in do_scsi_pt_v3()
1099 int verbose) in do_scsi_pt_v4() argument
1101 if (0 == ptp->io_hdr.request) { in do_scsi_pt_v4()
1102 if (verbose) in do_scsi_pt_v4()
1103 pr2ws("No SCSI command (cdb) given [v4]\n"); in do_scsi_pt_v4()
1107 ptp->io_hdr.timeout = ((time_secs > 0) ? (time_secs * 1000) : DEF_TIMEOUT); in do_scsi_pt_v4()
1108 if (ioctl(fd, SG_IO, &ptp->io_hdr) < 0) { in do_scsi_pt_v4()
1109 ptp->os_err = errno; in do_scsi_pt_v4()
1110 if (verbose > 1) in do_scsi_pt_v4()
1112 safe_strerror(ptp->os_err), ptp->os_err); in do_scsi_pt_v4()
1113 return -ptp->os_err; in do_scsi_pt_v4()
1122 do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose) in do_scsi_pt() argument
1124 struct sg_pt_linux_scsi * ptp = &vp->impl; in do_scsi_pt()
1125 bool have_checked_for_type = (ptp->dev_fd >= 0); in do_scsi_pt()
1129 sg_find_bsg_nvme_char_major(verbose); in do_scsi_pt()
1131 if (ptp->in_err) { in do_scsi_pt()
1132 if (verbose) in do_scsi_pt()
1137 if ((ptp->dev_fd >= 0) && (fd != ptp->dev_fd)) { in do_scsi_pt()
1138 if (verbose) in do_scsi_pt()
1143 ptp->dev_fd = fd; in do_scsi_pt()
1144 } else if (ptp->dev_fd < 0) { in do_scsi_pt()
1145 if (verbose) in do_scsi_pt()
1149 fd = ptp->dev_fd; in do_scsi_pt()
1151 int err = set_pt_file_handle(vp, ptp->dev_fd, verbose); in do_scsi_pt()
1154 return -ptp->os_err; in do_scsi_pt()
1156 if (ptp->os_err) in do_scsi_pt()
1157 return -ptp->os_err; in do_scsi_pt()
1158 if (verbose > 5) in do_scsi_pt()
1160 (int)ptp->is_nvme, (int)ptp->is_sg, (int)ptp->is_bsg); in do_scsi_pt()
1161 if (ptp->is_nvme) in do_scsi_pt()
1162 return sg_do_nvme_pt(vp, -1, time_secs, verbose); in do_scsi_pt()
1163 else if (ptp->is_sg) { in do_scsi_pt()
1165 return do_scsi_pt_v3(ptp, fd, time_secs, verbose); in do_scsi_pt()
1167 if (ptp->sg_version >= SG_LINUX_SG_VER_V4_BASE) in do_scsi_pt()
1168 return do_scsi_pt_v4(ptp, fd, time_secs, verbose); in do_scsi_pt()
1170 return do_scsi_pt_v3(ptp, fd, time_secs, verbose); in do_scsi_pt()
1173 return do_scsi_pt_v3(ptp, fd, time_secs, verbose); in do_scsi_pt()
1174 else if (ptp->is_bsg) in do_scsi_pt()
1175 return do_scsi_pt_v4(ptp, fd, time_secs, verbose); in do_scsi_pt()
1177 return do_scsi_pt_v3(ptp, fd, time_secs, verbose); in do_scsi_pt()