diff options
author | gjb <gjb@FreeBSD.org> | 2013-09-25 01:48:45 +0000 |
---|---|---|
committer | gjb <gjb@FreeBSD.org> | 2013-09-25 01:48:45 +0000 |
commit | d965f28ba1171a60f27bd8b0e21de9412e2640f2 (patch) | |
tree | 4ba80487d8d5ba6364f0f8d1bdf5ad85102180c3 /sys/cam | |
parent | 85074aa18eb69e2ea599def9d5b8a5bbb5addf8b (diff) | |
download | FreeBSD-src-d965f28ba1171a60f27bd8b0e21de9412e2640f2.zip FreeBSD-src-d965f28ba1171a60f27bd8b0e21de9412e2640f2.tar.gz |
Revert r255853 pending fixes to build errors in usr.bin/kdump
Approved by: re (implicit)
Diffstat (limited to 'sys/cam')
-rw-r--r-- | sys/cam/cam.h | 245 | ||||
-rw-r--r-- | sys/cam/cam_ccb.h | 29 | ||||
-rw-r--r-- | sys/cam/cam_compat.c | 129 | ||||
-rw-r--r-- | sys/cam/cam_compat.h | 68 | ||||
-rw-r--r-- | sys/cam/cam_xpt.c | 6 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_pass.c | 4 |
6 files changed, 89 insertions, 392 deletions
diff --git a/sys/cam/cam.h b/sys/cam/cam.h index 09103b6..a7d51db 100644 --- a/sys/cam/cam.h +++ b/sys/cam/cam.h @@ -40,10 +40,6 @@ typedef u_int path_id_t; typedef u_int target_id_t; typedef u_int lun_id_t; -typedef union { - u_int64_t lun64; - u_int8_t lun[8]; -} lun64_id_t; #define CAM_XPT_PATH_ID ((path_id_t)~0) #define CAM_BUS_WILDCARD ((path_id_t)~0) @@ -124,184 +120,69 @@ enum { /* CAM Status field values */ typedef enum { - /* CCB request is in progress */ - CAM_REQ_INPROG = 0x00, - - /* CCB request completed without error */ - CAM_REQ_CMP = 0x01, - - /* CCB request aborted by the host */ - CAM_REQ_ABORTED = 0x02, - - /* Unable to abort CCB request */ - CAM_UA_ABORT = 0x03, - - /* CCB request completed with an error */ - CAM_REQ_CMP_ERR = 0x04, - - /* CAM subsystem is busy */ - CAM_BUSY = 0x05, - - /* CCB request was invalid */ - CAM_REQ_INVALID = 0x06, - - /* Supplied Path ID is invalid */ - CAM_PATH_INVALID = 0x07, - - /* SCSI Device Not Installed/there */ - CAM_DEV_NOT_THERE = 0x08, - - /* Unable to terminate I/O CCB request */ - CAM_UA_TERMIO = 0x09, - - /* Target Selection Timeout */ - CAM_SEL_TIMEOUT = 0x0a, - - /* Command timeout */ - CAM_CMD_TIMEOUT = 0x0b, - - /* SCSI error, look at error code in CCB */ - CAM_SCSI_STATUS_ERROR = 0x0c, - - /* Message Reject Received */ - CAM_MSG_REJECT_REC = 0x0d, - - /* SCSI Bus Reset Sent/Received */ - CAM_SCSI_BUS_RESET = 0x0e, - - /* Uncorrectable parity error occurred */ - CAM_UNCOR_PARITY = 0x0f, - - /* Autosense: request sense cmd fail */ - CAM_AUTOSENSE_FAIL = 0x10, - - /* No HBA Detected error */ - CAM_NO_HBA = 0x11, - - /* Data Overrun error */ - CAM_DATA_RUN_ERR = 0x12, - - /* Unexpected Bus Free */ - CAM_UNEXP_BUSFREE = 0x13, - - /* Target Bus Phase Sequence Failure */ - CAM_SEQUENCE_FAIL = 0x14, - - /* CCB length supplied is inadequate */ - CAM_CCB_LEN_ERR = 0x15, - - /* Unable to provide requested capability*/ - CAM_PROVIDE_FAIL = 0x16, - - /* A SCSI BDR msg was sent to target */ - CAM_BDR_SENT = 0x17, - - /* CCB request terminated by the host */ - CAM_REQ_TERMIO = 0x18, - - /* Unrecoverable Host Bus Adapter Error */ - CAM_UNREC_HBA_ERROR = 0x19, - - /* Request was too large for this host */ - CAM_REQ_TOO_BIG = 0x1a, - - /* - * This request should be requeued to preserve - * transaction ordering. This typically occurs - * when the SIM recognizes an error that should - * freeze the queue and must place additional - * requests for the target at the sim level - * back into the XPT queue. - */ - CAM_REQUEUE_REQ = 0x1b, - - /* ATA error, look at error code in CCB */ - CAM_ATA_STATUS_ERROR = 0x1c, - - /* Initiator/Target Nexus lost. */ - CAM_SCSI_IT_NEXUS_LOST = 0x1d, - - /* SMP error, look at error code in CCB */ - CAM_SMP_STATUS_ERROR = 0x1e, - - /* - * Command completed without error but exceeded the soft - * timeout threshold. - */ - CAM_REQ_SOFTTIMEOUT = 0x1f, - - /* - * 0x20 - 0x32 are unassigned - */ - - /* Initiator Detected Error */ - CAM_IDE = 0x33, - - /* Resource Unavailable */ - CAM_RESRC_UNAVAIL = 0x34, - - /* Unacknowledged Event by Host */ - CAM_UNACKED_EVENT = 0x35, - - /* Message Received in Host Target Mode */ - CAM_MESSAGE_RECV = 0x36, - - /* Invalid CDB received in Host Target Mode */ - CAM_INVALID_CDB = 0x37, - - /* Lun supplied is invalid */ - CAM_LUN_INVALID = 0x38, - - /* Target ID supplied is invalid */ - CAM_TID_INVALID = 0x39, - - /* The requested function is not available */ - CAM_FUNC_NOTAVAIL = 0x3a, - - /* Nexus is not established */ - CAM_NO_NEXUS = 0x3b, - - /* The initiator ID is invalid */ - CAM_IID_INVALID = 0x3c, - - /* The SCSI CDB has been received */ - CAM_CDB_RECVD = 0x3d, - - /* The LUN is already enabled for target mode */ - CAM_LUN_ALRDY_ENA = 0x3e, - - /* SCSI Bus Busy */ - CAM_SCSI_BUSY = 0x3f, - - - /* - * Flags - */ - - /* The DEV queue is frozen w/this err */ - CAM_DEV_QFRZN = 0x40, - - /* Autosense data valid for target */ - CAM_AUTOSNS_VALID = 0x80, - - /* SIM ready to take more commands */ - CAM_RELEASE_SIMQ = 0x100, - - /* SIM has this command in it's queue */ - CAM_SIM_QUEUED = 0x200, - - /* Quality of service data is valid */ - CAM_QOS_VALID = 0x400, - - /* Mask bits for just the status # */ - CAM_STATUS_MASK = 0x3F, - - /* - * Target Specific Adjunct Status - */ - - /* sent sense with status */ - CAM_SENT_SENSE = 0x40000000 + CAM_REQ_INPROG, /* CCB request is in progress */ + CAM_REQ_CMP, /* CCB request completed without error */ + CAM_REQ_ABORTED, /* CCB request aborted by the host */ + CAM_UA_ABORT, /* Unable to abort CCB request */ + CAM_REQ_CMP_ERR, /* CCB request completed with an error */ + CAM_BUSY, /* CAM subsystem is busy */ + CAM_REQ_INVALID, /* CCB request was invalid */ + CAM_PATH_INVALID, /* Supplied Path ID is invalid */ + CAM_DEV_NOT_THERE, /* SCSI Device Not Installed/there */ + CAM_UA_TERMIO, /* Unable to terminate I/O CCB request */ + CAM_SEL_TIMEOUT, /* Target Selection Timeout */ + CAM_CMD_TIMEOUT, /* Command timeout */ + CAM_SCSI_STATUS_ERROR, /* SCSI error, look at error code in CCB */ + CAM_MSG_REJECT_REC, /* Message Reject Received */ + CAM_SCSI_BUS_RESET, /* SCSI Bus Reset Sent/Received */ + CAM_UNCOR_PARITY, /* Uncorrectable parity error occurred */ + CAM_AUTOSENSE_FAIL = 0x10,/* Autosense: request sense cmd fail */ + CAM_NO_HBA, /* No HBA Detected error */ + CAM_DATA_RUN_ERR, /* Data Overrun error */ + CAM_UNEXP_BUSFREE, /* Unexpected Bus Free */ + CAM_SEQUENCE_FAIL, /* Target Bus Phase Sequence Failure */ + CAM_CCB_LEN_ERR, /* CCB length supplied is inadequate */ + CAM_PROVIDE_FAIL, /* Unable to provide requested capability */ + CAM_BDR_SENT, /* A SCSI BDR msg was sent to target */ + CAM_REQ_TERMIO, /* CCB request terminated by the host */ + CAM_UNREC_HBA_ERROR, /* Unrecoverable Host Bus Adapter Error */ + CAM_REQ_TOO_BIG, /* The request was too large for this host */ + CAM_REQUEUE_REQ, /* + * This request should be requeued to preserve + * transaction ordering. This typically occurs + * when the SIM recognizes an error that should + * freeze the queue and must place additional + * requests for the target at the sim level + * back into the XPT queue. + */ + CAM_ATA_STATUS_ERROR, /* ATA error, look at error code in CCB */ + CAM_SCSI_IT_NEXUS_LOST, /* Initiator/Target Nexus lost. */ + CAM_SMP_STATUS_ERROR, /* SMP error, look at error code in CCB */ + CAM_IDE = 0x33, /* Initiator Detected Error */ + CAM_RESRC_UNAVAIL, /* Resource Unavailable */ + CAM_UNACKED_EVENT, /* Unacknowledged Event by Host */ + CAM_MESSAGE_RECV, /* Message Received in Host Target Mode */ + CAM_INVALID_CDB, /* Invalid CDB received in Host Target Mode */ + CAM_LUN_INVALID, /* Lun supplied is invalid */ + CAM_TID_INVALID, /* Target ID supplied is invalid */ + CAM_FUNC_NOTAVAIL, /* The requested function is not available */ + CAM_NO_NEXUS, /* Nexus is not established */ + CAM_IID_INVALID, /* The initiator ID is invalid */ + CAM_CDB_RECVD, /* The SCSI CDB has been received */ + CAM_LUN_ALRDY_ENA, /* The LUN is already enabled for target mode */ + CAM_SCSI_BUSY, /* SCSI Bus Busy */ + + CAM_DEV_QFRZN = 0x40, /* The DEV queue is frozen w/this err */ + + /* Autosense data valid for target */ + CAM_AUTOSNS_VALID = 0x80, + CAM_RELEASE_SIMQ = 0x100,/* SIM ready to take more commands */ + CAM_SIM_QUEUED = 0x200,/* SIM has this command in it's queue */ + + CAM_STATUS_MASK = 0x3F, /* Mask bits for just the status # */ + + /* Target Specific Adjunct Status */ + CAM_SENT_SENSE = 0x40000000 /* sent sense with status */ } cam_status; typedef enum { diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 3f594cb..4012068 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -107,10 +107,6 @@ typedef enum { CAM_SEND_STATUS = 0x40000000 /* Send status after data phase */ } ccb_flags; -typedef enum { - CAM_EXTLUN_VALID = 0x00000001,/* 64bit lun field is valid */ -} ccb_xflags; - /* XPT Opcodes for xpt_action */ typedef enum { /* Function code flags are bits greater than 0xff */ @@ -300,12 +296,6 @@ typedef union { u_int8_t bytes[CCB_SIM_PRIV_SIZE * sizeof(ccb_priv_entry)]; } ccb_spriv_area; -typedef struct { - struct timeval *etime; - uintptr_t sim_data; - uintptr_t periph_data; -} ccb_qos_area; - struct ccb_hdr { cam_pinfo pinfo; /* Info for priority scheduling */ camq_entry xpt_links; /* For chaining in the XPT layer */ @@ -320,14 +310,16 @@ struct ccb_hdr { path_id_t path_id; /* Path ID for the request */ target_id_t target_id; /* Target device ID */ lun_id_t target_lun; /* Target LUN number */ - lun64_id_t ext_lun; /* 64bit extended/multi-level LUNs */ u_int32_t flags; /* ccb_flags */ - u_int32_t xflags; /* Extended flags */ ccb_ppriv_area periph_priv; ccb_spriv_area sim_priv; - ccb_qos_area qos; - u_int32_t timeout; /* Hard timeout value in seconds */ - struct timeval softtimeout; /* Soft timeout value in sec + usec */ + u_int32_t timeout; /* Timeout value */ + + /* + * Deprecated, only for use by non-MPSAFE SIMs. All others must + * allocate and initialize their own callout storage. + */ + struct callout_handle timeout_ch; }; /* Get Device Information CCB */ @@ -549,7 +541,7 @@ struct ccb_dev_match { /* * Definitions for the path inquiry CCB fields. */ -#define CAM_VERSION 0x18 /* Hex value for current version */ +#define CAM_VERSION 0x17 /* Hex value for current version */ typedef enum { PI_MDP_ABLE = 0x80, /* Supports MDP message */ @@ -572,7 +564,6 @@ typedef enum { } pi_tmflag; typedef enum { - PIM_EXTLUNS = 0x100,/* 64bit extended LUNs supported */ PIM_SCANHILO = 0x80, /* Bus scans from high ID to low ID */ PIM_NOREMOVE = 0x40, /* Removeable devices not included in scan */ PIM_NOINITIATOR = 0x20, /* Initiator role not supported. */ @@ -604,8 +595,8 @@ struct ccb_pathinq { struct ccb_hdr ccb_h; u_int8_t version_num; /* Version number for the SIM/HBA */ u_int8_t hba_inquiry; /* Mimic of INQ byte 7 for the HBA */ - u_int16_t target_sprt; /* Flags for target mode support */ - u_int32_t hba_misc; /* Misc HBA features */ + u_int8_t target_sprt; /* Flags for target mode support */ + u_int8_t hba_misc; /* Misc HBA features */ u_int16_t hba_eng_cnt; /* HBA engine count */ /* Vendor Unique capabilities */ u_int8_t vuhba_flags[VUHBALEN]; diff --git a/sys/cam/cam_compat.c b/sys/cam/cam_compat.c index f291479..a24debc 100644 --- a/sys/cam/cam_compat.c +++ b/sys/cam/cam_compat.c @@ -44,28 +44,23 @@ __FBSDID("$FreeBSD$"); #include <cam/cam.h> #include <cam/cam_ccb.h> -#include <cam/cam_xpt.h> #include <cam/cam_compat.h> #include <cam/scsi/scsi_pass.h> #include "opt_cam.h" -static int cam_compat_handle_0x17(struct cdev *dev, u_long cmd, caddr_t addr, - int flag, struct thread *td, d_ioctl_t *cbfnp); - int -cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, - struct thread *td, d_ioctl_t *cbfnp) +cam_compat_ioctl(struct cdev *dev, u_long *cmd, caddr_t *addr, int *flag, struct thread *td) { int error; - switch (cmd) { + switch (*cmd) { case CAMIOCOMMAND_0x16: { union ccb *ccb; - ccb = (union ccb *)addr; + ccb = (union ccb *)*addr; if (ccb->ccb_h.flags & CAM_SG_LIST_PHYS_0x16) { ccb->ccb_h.flags &= ~CAM_SG_LIST_PHYS_0x16; ccb->ccb_h.flags |= CAM_DATA_SG_PADDR; @@ -78,21 +73,13 @@ cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, ccb->ccb_h.flags &= CAM_SCATTER_VALID_0x16; ccb->ccb_h.flags |= CAM_DATA_SG; } - cmd = CAMIOCOMMAND; - error = (cbfnp)(dev, cmd, addr, flag, td); + *cmd = CAMIOCOMMAND; + error = EAGAIN; break; } case CAMGETPASSTHRU_0x16: - cmd = CAMGETPASSTHRU; - error = (cbfnp)(dev, cmd, addr, flag, td); - break; - case CAMIOCOMMAND_0x17: - cmd = CAMIOCOMMAND; - error = cam_compat_handle_0x17(dev, cmd, addr, flag, td, cbfnp); - break; - case CAMGETPASSTHRU_0x17: - cmd = CAMGETPASSTHRU; - error = cam_compat_handle_0x17(dev, cmd, addr, flag, td, cbfnp); + *cmd = CAMGETPASSTHRU; + error = EAGAIN; break; default: error = ENOTTY; @@ -100,105 +87,3 @@ cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, return (error); } - -static int -cam_compat_handle_0x17(struct cdev *dev, u_long cmd, caddr_t addr, int flag, - struct thread *td, d_ioctl_t *cbfnp) -{ - union ccb *ccb; - struct ccb_hdr *hdr; - struct ccb_hdr_0x17 *hdr17; - uint8_t *ccbb, *ccbb17; - u_int error; - - hdr17 = (struct ccb_hdr_0x17 *)addr; - ccb = xpt_alloc_ccb(); - hdr = &ccb->ccb_h; - - hdr->pinfo = hdr17->pinfo; - hdr->xpt_links = hdr17->xpt_links; - hdr->sim_links = hdr17->sim_links; - hdr->periph_links = hdr17->periph_links; - hdr->retry_count = hdr17->retry_count; - hdr->cbfcnp = hdr17->cbfcnp; - hdr->func_code = hdr17->func_code; - hdr->status = hdr17->status; - hdr->path = hdr17->path; - hdr->path_id = hdr17->path_id; - hdr->target_id = hdr17->target_id; - hdr->target_lun = hdr17->target_lun; - hdr->ext_lun.lun64 = 0; - hdr->flags = hdr17->flags; - hdr->xflags = 0; - hdr->periph_priv = hdr17->periph_priv; - hdr->sim_priv = hdr17->sim_priv; - hdr->timeout = hdr17->timeout; - hdr->softtimeout.tv_sec = 0; - hdr->softtimeout.tv_usec = 0; - - ccbb = (uint8_t *)&hdr[1]; - ccbb17 = (uint8_t *)&hdr17[1]; - bcopy(ccbb17, ccbb, CAM_0X17_DATA_LEN); - - error = (cbfnp)(dev, cmd, (caddr_t)ccb, flag, td); - - hdr17->pinfo = hdr->pinfo; - hdr17->xpt_links = hdr->xpt_links; - hdr17->sim_links = hdr->sim_links; - hdr17->periph_links = hdr->periph_links; - hdr17->retry_count = hdr->retry_count; - hdr17->cbfcnp = hdr->cbfcnp; - hdr17->func_code = hdr->func_code; - hdr17->status = hdr->status; - hdr17->path = hdr->path; - hdr17->path_id = hdr->path_id; - hdr17->target_id = hdr->target_id; - hdr17->target_lun = hdr->target_lun; - hdr17->flags = hdr->flags; - hdr17->periph_priv = hdr->periph_priv; - hdr17->sim_priv = hdr->sim_priv; - hdr17->timeout = hdr->timeout; - - /* The PATH_INQ only needs special handling on the way out */ - if (ccb->ccb_h.func_code != XPT_PATH_INQ) { - bcopy(ccbb, ccbb17, CAM_0X17_DATA_LEN); - } else { - struct ccb_pathinq *cpi; - struct ccb_pathinq_0x17 *cpi17; - - cpi = &ccb->cpi; - cpi17 = (struct ccb_pathinq_0x17 *)hdr17; - cpi17->version_num = cpi->version_num; - cpi17->hba_inquiry = cpi->hba_inquiry; - cpi17->target_sprt = (u_int8_t)cpi->target_sprt; - cpi17->hba_misc = (u_int8_t)cpi->hba_misc; - cpi17->hba_eng_cnt = cpi->hba_eng_cnt; - bcopy(&cpi->vuhba_flags[0], &cpi17->vuhba_flags[0], VUHBALEN); - cpi17->max_target = cpi->max_target; - cpi17->max_lun = cpi->max_lun; - cpi17->async_flags = cpi->async_flags; - cpi17->hpath_id = cpi->hpath_id; - cpi17->initiator_id = cpi->initiator_id; - bcopy(&cpi->sim_vid[0], &cpi17->sim_vid[0], SIM_IDLEN); - bcopy(&cpi->hba_vid[0], &cpi17->hba_vid[0], HBA_IDLEN); - bcopy(&cpi->dev_name[0], &cpi17->dev_name[0], DEV_IDLEN); - cpi17->unit_number = cpi->unit_number; - cpi17->bus_id = cpi->bus_id; - cpi17->base_transfer_speed = cpi->base_transfer_speed; - cpi17->protocol = cpi->protocol; - cpi17->protocol_version = cpi->protocol_version; - cpi17->transport = cpi->transport; - cpi17->transport_version = cpi->transport_version; - bcopy(&cpi->xport_specific, &cpi17->xport_specific, - PATHINQ_SETTINGS_SIZE); - cpi17->maxio = cpi->maxio; - cpi17->hba_vendor = cpi->hba_vendor; - cpi17->hba_device = cpi->hba_device; - cpi17->hba_subvendor = cpi->hba_subvendor; - cpi17->hba_subdevice = cpi->hba_subdevice; - } - - xpt_free_ccb(ccb); - - return (error); -} diff --git a/sys/cam/cam_compat.h b/sys/cam/cam_compat.h index b873ec3..53ead7a 100644 --- a/sys/cam/cam_compat.h +++ b/sys/cam/cam_compat.h @@ -31,7 +31,7 @@ #ifndef _CAM_CAM_COMPAT_H #define _CAM_CAM_COMPAT_H -int cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td, d_ioctl_t *cbfnp); +int cam_compat_ioctl(struct cdev *dev, u_long *cmd, caddr_t *addr, int *flag, struct thread *td); /* Version 0x16 compatibility */ #define CAM_VERSION_0x16 0x16 @@ -44,71 +44,5 @@ int cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struc #define CAM_SG_LIST_PHYS_0x16 0x00040000 #define CAM_DATA_PHYS_0x16 0x00200000 -/* Version 0x17 compatibility */ -#define CAM_VERSION_0x17 0x17 - -struct ccb_hdr_0x17 { - cam_pinfo pinfo; /* Info for priority scheduling */ - camq_entry xpt_links; /* For chaining in the XPT layer */ - camq_entry sim_links; /* For chaining in the SIM layer */ - camq_entry periph_links; /* For chaining in the type driver */ - u_int32_t retry_count; - void (*cbfcnp)(struct cam_periph *, union ccb *); - xpt_opcode func_code; /* XPT function code */ - u_int32_t status; /* Status returned by CAM subsystem */ - struct cam_path *path; /* Compiled path for this ccb */ - path_id_t path_id; /* Path ID for the request */ - target_id_t target_id; /* Target device ID */ - lun_id_t target_lun; /* Target LUN number */ - u_int32_t flags; /* ccb_flags */ - ccb_ppriv_area periph_priv; - ccb_spriv_area sim_priv; - u_int32_t timeout; /* Hard timeout value in seconds */ - struct callout_handle timeout_ch; -}; - -struct ccb_pathinq_0x17 { - struct ccb_hdr_0x17 ccb_h; - u_int8_t version_num; /* Version number for the SIM/HBA */ - u_int8_t hba_inquiry; /* Mimic of INQ byte 7 for the HBA */ - u_int8_t target_sprt; /* Flags for target mode support */ - u_int8_t hba_misc; /* Misc HBA features */ - u_int16_t hba_eng_cnt; /* HBA engine count */ - /* Vendor Unique capabilities */ - u_int8_t vuhba_flags[VUHBALEN]; - u_int32_t max_target; /* Maximum supported Target */ - u_int32_t max_lun; /* Maximum supported Lun */ - u_int32_t async_flags; /* Installed Async handlers */ - path_id_t hpath_id; /* Highest Path ID in the subsystem */ - target_id_t initiator_id; /* ID of the HBA on the SCSI bus */ - char sim_vid[SIM_IDLEN]; /* Vendor ID of the SIM */ - char hba_vid[HBA_IDLEN]; /* Vendor ID of the HBA */ - char dev_name[DEV_IDLEN];/* Device name for SIM */ - u_int32_t unit_number; /* Unit number for SIM */ - u_int32_t bus_id; /* Bus ID for SIM */ - u_int32_t base_transfer_speed;/* Base bus speed in KB/sec */ - cam_proto protocol; - u_int protocol_version; - cam_xport transport; - u_int transport_version; - union { - struct ccb_pathinq_settings_spi spi; - struct ccb_pathinq_settings_fc fc; - struct ccb_pathinq_settings_sas sas; - char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE]; - } xport_specific; - u_int maxio; /* Max supported I/O size, in bytes. */ - u_int16_t hba_vendor; /* HBA vendor ID */ - u_int16_t hba_device; /* HBA device ID */ - u_int16_t hba_subvendor; /* HBA subvendor ID */ - u_int16_t hba_subdevice; /* HBA subdevice ID */ -}; - -#define CAM_0X17_LEN (sizeof(union ccb) - sizeof(struct ccb_hdr) + sizeof(struct ccb_hdr_0x17)) -#define CAM_0X17_DATA_LEN (sizeof(union ccb) - sizeof(struct ccb_hdr_0x17)) - -#define CAMIOCOMMAND_0x17 _IOC(IOC_INOUT, CAM_VERSION_0x17, 2, CAM_0X17_LEN) -#define CAMGETPASSTHRU_0x17 _IOC(IOC_INOUT, CAM_VERSION_0x17, 3, CAM_0X17_LEN) - #endif diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 2c187d3..e50b0ad 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -397,7 +397,9 @@ xptioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td int error; if ((error = xptdoioctl(dev, cmd, addr, flag, td)) == ENOTTY) { - error = cam_compat_ioctl(dev, cmd, addr, flag, td, xptdoioctl); + error = cam_compat_ioctl(dev, &cmd, &addr, &flag, td); + if (error == EAGAIN) + return (xptdoioctl(dev, cmd, addr, flag, td)); } return (error); } @@ -4383,6 +4385,8 @@ xpt_get_ccb(struct cam_ed *device) if (new_ccb == NULL) { return (NULL); } + if ((sim->flags & CAM_SIM_MPSAFE) == 0) + callout_handle_init(&new_ccb->ccb_h.timeout_ch); SLIST_INSERT_HEAD(&sim->ccb_freeq, &new_ccb->ccb_h, xpt_links.sle); sim->ccb_count++; diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c index 6ce9bb0..61f4f42 100644 --- a/sys/cam/scsi/scsi_pass.c +++ b/sys/cam/scsi/scsi_pass.c @@ -580,7 +580,9 @@ passioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *t int error; if ((error = passdoioctl(dev, cmd, addr, flag, td)) == ENOTTY) { - error = cam_compat_ioctl(dev, cmd, addr, flag, td, passdoioctl); + error = cam_compat_ioctl(dev, &cmd, &addr, &flag, td); + if (error == EAGAIN) + return (passdoioctl(dev, cmd, addr, flag, td)); } return (error); } |