37#include <sys/kernel.h>
38#include <sys/sysctl.h>
53#include <sys/libkern.h>
65 {
CAM_REQ_CMP,
"CCB request completed without error" },
69 {
CAM_BUSY,
"CAM subsystem is busy" },
95 {
CAM_IDE,
"Initiator Detected Error Message Received" },
114#ifndef CAM_DEFAULT_SORT_IO_QUEUES
115#define CAM_DEFAULT_SORT_IO_QUEUES 1
119SYSCTL_INT(_kern_cam, OID_AUTO, sort_io_queues, CTLFLAG_RWTUN,
124cam_strvis(u_int8_t *dst,
const u_int8_t *src,
int srclen,
int dstlen)
136 sbuf_new(&sb, dst, dstlen, SBUF_FIXEDLEN);
147 while (srclen > 0 && src[0] ==
' ')
150 && (src[srclen-1] ==
' ' || src[srclen-1] ==
'\0'))
154 if (*src < 0x20 || *src >= 0x80) {
159 sbuf_printf(sb,
"\\%c%c%c",
160 ((*src & 0300) >> 6) +
'0',
161 ((*src & 0070) >> 3) +
'0',
162 ((*src & 0007) >> 0) +
'0');
207 while (*pattern !=
'\0' && str_len > 0) {
208 if (*pattern ==
'*') {
210 if (*pattern ==
'\0')
217 }
while (str_len > 0);
219 }
else if (*pattern ==
'[') {
220 int negate_range, ok;
221 uint8_t pc = UCHAR_MAX;
228 if ((negate_range = (*pattern ==
'^')) != 0)
230 while ((*pattern !=
']') && *pattern !=
'\0') {
231 if (*pattern ==
'-') {
232 if (pattern[1] ==
'\0')
234 if (sc >= pc && sc <= pattern[1])
237 }
else if (*pattern == sc)
242 if (ok == negate_range)
245 }
else if (*pattern ==
'?') {
254 if (*str != *pattern)
263 while (*pattern ==
'*')
266 if ( *pattern !=
'\0') {
272 while (str_len > 0 && *str ==
' ') {
284 for (; num_entries > 0; num_entries--, quirk_table += entry_size) {
285 if ((*comp_func)(target, quirk_table) == 0)
286 return (quirk_table);
388 cam_path_string(device, path_str,
sizeof(path_str));
391 sbuf_new(&sb, str, str_len, 0);
394 sbuf_cat(&sb, path_str);
408 strlen(path_str), (proto_flags &
416 sbuf_printf(&sb,
"CAM func %#x",
420 sbuf_printf(&sb,
"\n");
427 sbuf_cat(&sb, path_str);
434 sbuf_printf(&sb,
"CAM status: Unknown (%#x)\n",
437 sbuf_printf(&sb,
"CAM status: %s\n",
449 sbuf_cat(&sb, path_str);
451 sbuf_printf(&sb,
"\n");
454 sbuf_cat(&sb, path_str);
455 sbuf_printf(&sb,
"RES: ");
457 sbuf_printf(&sb,
"\n");
467 sbuf_cat(&sb, path_str);
468 sbuf_printf(&sb,
"SCSI status: %s\n",
490 sbuf_cat(&sb, path_str);
491 sbuf_printf(&sb,
"SMP status: %s (%#x)\n",
504 return(sbuf_data(&sb));
528 if ((device == NULL) || (
ccb == NULL) || (ofile == NULL))
532 flags, proto_flags));
547 uint32_t size_mb, secs_per_cylinder;
559 if (size_mb > 1024 && extended) {
567 if (secs_per_cylinder == 0) {
int ata_res_sbuf(struct ata_res *res, struct sbuf *sb)
int ata_command_sbuf(struct ccb_ataio *ataio, struct sbuf *sb)
int ata_status_sbuf(struct ccb_ataio *ataio, struct sbuf *sb)
const struct cam_status_entry cam_status_table[]
#define CAM_DEFAULT_SORT_IO_QUEUES
char * cam_error_string(union ccb *ccb, char *str, int str_len, cam_error_string_flags flags, cam_error_proto_flags proto_flags)
caddr_t cam_quirkmatch(caddr_t target, caddr_t quirk_table, int num_entries, int entry_size, cam_quirkmatch_t *comp_func)
int cam_strmatch(const u_int8_t *str, const u_int8_t *pattern, int str_len)
void cam_strvis_sbuf(struct sbuf *sb, const u_int8_t *src, int srclen, uint32_t flags)
const struct cam_status_entry * cam_fetch_status_entry(cam_status status)
static int camstatusentrycomp(const void *key, const void *member)
void cam_strvis(u_int8_t *dst, const u_int8_t *src, int srclen, int dstlen)
void cam_strvis_flag(u_int8_t *dst, const u_int8_t *src, int srclen, int dstlen, uint32_t flags)
FEATURE(scbus, "SCSI devices support")
void cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended)
SYSCTL_INT(_kern_cam, OID_AUTO, sort_io_queues, CTLFLAG_RWTUN, &cam_sort_io_queues, 0, "Sort IO queues to try and optimise disk access patterns")
void cam_error_print(union ccb *ccb, cam_error_string_flags flags, cam_error_proto_flags proto_flags)
SYSCTL_NODE(_kern, OID_AUTO, cam, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "CAM Subsystem")
@ CAM_STRVIS_FLAG_NONASCII_MASK
@ CAM_STRVIS_FLAG_NONASCII_ESC
@ CAM_STRVIS_FLAG_NONASCII_SPC
@ CAM_STRVIS_FLAG_NONASCII_RAW
@ CAM_STRVIS_FLAG_NONASCII_TRIM
__BEGIN_DECLS typedef int() cam_quirkmatch_t(caddr_t, caddr_t)
@ CAM_ESMF_PRINT_FULL_CMD
int xpt_path_string(struct cam_path *path, char *str, size_t str_len)
int nvme_command_sbuf(struct ccb_nvmeio *nvmeio, struct sbuf *sb)
const char * scsi_status_string(struct ccb_scsiio *csio)
int scsi_sense_sbuf(struct ccb_scsiio *csio, struct sbuf *sb, scsi_sense_string_flags flags)
int scsi_command_string(struct ccb_scsiio *csio, struct sbuf *sb)
#define SCSI_STATUS_CHECK_COND
const char * smp_error_desc(int function_result)
void smp_command_sbuf(struct ccb_smpio *smpio, struct sbuf *sb, char *line_prefix, int first_line_len, int line_len)