summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authorgjb <gjb@FreeBSD.org>2013-09-25 01:48:45 +0000
committergjb <gjb@FreeBSD.org>2013-09-25 01:48:45 +0000
commitd965f28ba1171a60f27bd8b0e21de9412e2640f2 (patch)
tree4ba80487d8d5ba6364f0f8d1bdf5ad85102180c3 /sys/cam
parent85074aa18eb69e2ea599def9d5b8a5bbb5addf8b (diff)
downloadFreeBSD-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.h245
-rw-r--r--sys/cam/cam_ccb.h29
-rw-r--r--sys/cam/cam_compat.c129
-rw-r--r--sys/cam/cam_compat.h68
-rw-r--r--sys/cam/cam_xpt.c6
-rw-r--r--sys/cam/scsi/scsi_pass.c4
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);
}
OpenPOWER on IntegriCloud