PERFORCE change 162644 for review
Alexander Motin
mav at FreeBSD.org
Sun May 24 14:11:30 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=162644
Change 162644 by mav at mav_mavbook on 2009/05/24 14:10:43
Add initial ATA XPT and ATA disk devices. It allows CAM to operate
SIMs with XPORT_ATA transport type and devices with PROTO_ATA protocol.
To send ATA commands new opcode XPT_ATA_IO added to xpt_action.
Teach SCSI drivers do not try to attach to ATA devices.
The only exception now is pass driver, I am just not sure.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#1 add
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#1 add
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_da.c#1 add
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#1 add
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.h#1 add
.. //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#16 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#87 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_internal.h#2 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.c#24 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.c#16 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#39 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pt.c#12 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sa.c#18 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#19 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sg.c#12 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#16 (text+ko) ====
@@ -40,6 +40,7 @@
#endif
#include <cam/cam_debug.h>
#include <cam/scsi/scsi_all.h>
+#include <cam/ata/ata_all.h>
/* General allocation length definitions for CCB structures */
@@ -169,6 +170,8 @@
* a device give the sector size and
* volume size.
*/
+ XPT_ATA_IO = 0x18 | XPT_FC_DEV_QUEUED,
+ /* Execute the requested ATA I/O operation */
/* HBA engine commands 0x20->0x2F */
XPT_ENG_INQ = 0x20 | XPT_FC_XPT_ONLY,
@@ -284,7 +287,9 @@
/* Get Device Information CCB */
struct ccb_getdev {
struct ccb_hdr ccb_h;
+ cam_proto protocol;
struct scsi_inquiry_data inq_data;
+ struct ata_params ident_data;
u_int8_t serial_num[252];
u_int8_t reserved;
u_int8_t serial_num_len;
@@ -412,7 +417,9 @@
path_id_t path_id;
target_id_t target_id;
lun_id_t target_lun;
+ cam_proto protocol;
struct scsi_inquiry_data inq_data;
+ struct ata_params ident_data;
dev_result_flags flags;
};
@@ -617,6 +624,31 @@
u_int init_id; /* initiator id of who selected */
};
+/*
+ * ATA I/O Request CCB used for the XPT_ATA_IO function code.
+ */
+struct ccb_ataio {
+ struct ccb_hdr ccb_h;
+ union ccb *next_ccb; /* Ptr for next CCB for action */
+ u_int8_t *req_map; /* Ptr to mapping info */
+ struct ata_cmd cmd;
+ u_int8_t *data_ptr; /* Ptr to the data buf/SG list */
+ u_int32_t dxfer_len; /* Data transfer length */
+ /* Autosense storage */
+ u_int16_t sglist_cnt; /* Number of SG list entries */
+ u_int8_t status; /* Returned ATA status */
+ u_int32_t resid; /* Transfer residual length: 2's comp */
+ u_int8_t tag_action; /* What to do for tag queueing */
+ /*
+ * The tag action should be either the define below (to send a
+ * non-tagged transaction) or one of the defined scsi tag messages
+ * from scsi_message.h.
+ */
+#define CAM_TAG_ACTION_NONE 0x00
+ u_int tag_id; /* tag id from initator (target mode) */
+ u_int init_id; /* initiator id of who selected */
+};
+
struct ccb_accept_tio {
struct ccb_hdr ccb_h;
cdb_t cdb_io; /* Union for CDB bytes/pointer */
@@ -907,6 +939,7 @@
struct ccb_eng_exec cee;
struct ccb_rescan crcn;
struct ccb_debug cdbg;
+ struct ccb_ataio ataio;
};
__BEGIN_DECLS
@@ -924,7 +957,14 @@
u_int32_t flags, u_int tag_action, u_int tag_id,
u_int init_id, u_int scsi_status, u_int8_t *data_ptr,
u_int32_t dxfer_len, u_int32_t timeout);
-
+
+static __inline void
+cam_fill_ataio(struct ccb_ataio *ataio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int32_t flags, u_int tag_action,
+ u_int8_t *data_ptr, u_int32_t dxfer_len,
+ u_int32_t timeout);
+
static __inline void
cam_fill_csio(struct ccb_scsiio *csio, u_int32_t retries,
void (*cbfcnp)(struct cam_periph *, union ccb *),
@@ -965,6 +1005,23 @@
csio->init_id = init_id;
}
+static __inline void
+cam_fill_ataio(struct ccb_ataio *ataio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int32_t flags, u_int tag_action,
+ u_int8_t *data_ptr, u_int32_t dxfer_len,
+ u_int32_t timeout)
+{
+ ataio->ccb_h.func_code = XPT_ATA_IO;
+ ataio->ccb_h.flags = flags;
+ ataio->ccb_h.retry_count = retries;
+ ataio->ccb_h.cbfcnp = cbfcnp;
+ ataio->ccb_h.timeout = timeout;
+ ataio->data_ptr = data_ptr;
+ ataio->dxfer_len = dxfer_len;
+ ataio->tag_action = tag_action;
+}
+
void cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended);
__END_DECLS
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#87 (text+ko) ====
@@ -1686,9 +1686,14 @@
device->target->target_id;
cdm->matches[j].result.device_result.target_lun =
device->lun_id;
+ cdm->matches[j].result.device_result.protocol =
+ device->protocol;
bcopy(&device->inq_data,
&cdm->matches[j].result.device_result.inq_data,
sizeof(struct scsi_inquiry_data));
+ bcopy(&device->ident_data,
+ &cdm->matches[j].result.device_result.ident_data,
+ sizeof(struct ata_params));
/* Let the user know whether this device is unconfigured */
if (device->flags & CAM_DEV_UNCONFIGURED)
@@ -2446,6 +2451,10 @@
start_ccb->csio.sense_resid = 0;
start_ccb->csio.resid = 0;
/* FALLTHROUGH */
+ case XPT_ATA_IO:
+ if (start_ccb->ccb_h.func_code == XPT_ATA_IO) {
+ start_ccb->ataio.status = 0;
+ }
case XPT_RESET_DEV:
case XPT_ENG_EXEC:
{
@@ -2584,7 +2593,9 @@
cgd = &start_ccb->cgd;
bus = cgd->ccb_h.path->bus;
tar = cgd->ccb_h.path->target;
+ cgd->protocol = dev->protocol;
cgd->inq_data = dev->inq_data;
+ cgd->ident_data = dev->ident_data;
cgd->ccb_h.status = CAM_REQ_CMP;
cgd->serial_num_len = dev->serial_num_len;
if ((dev->serial_num_len > 0)
@@ -3782,8 +3793,12 @@
case XPORT_SPI:
case XPORT_SAS:
case XPORT_FC:
+ case XPORT_USB:
new_bus->xport = scsi_get_xport();
break;
+ case XPORT_ATA:
+ new_bus->xport = ata_get_xport();
+ break;
default:
new_bus->xport = &xport_default;
break;
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_internal.h#2 (text+ko) ====
@@ -64,6 +64,7 @@
cam_xport transport;
u_int transport_version;
struct scsi_inquiry_data inq_data;
+ struct ata_params ident_data;
u_int8_t inq_flags; /*
* Current settings for inquiry flags.
* This allows us to override settings
@@ -134,6 +135,7 @@
};
struct xpt_xport * scsi_get_xport(void);
+struct xpt_xport * ata_get_xport(void);
struct cam_ed * xpt_alloc_device(struct cam_eb *bus,
struct cam_et *target,
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.c#24 (text+ko) ====
@@ -496,6 +496,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
if (SID_TYPE(&cgd->inq_data) != T_CDROM
&& SID_TYPE(&cgd->inq_data) != T_WORM)
break;
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.c#16 (text+ko) ====
@@ -287,6 +287,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
if (SID_TYPE(&cgd->inq_data)!= T_CHANGER)
break;
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#39 (text+ko) ====
@@ -1028,6 +1028,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
if (SID_TYPE(&cgd->inq_data) != T_DIRECT
&& SID_TYPE(&cgd->inq_data) != T_RBC
&& SID_TYPE(&cgd->inq_data) != T_OPTICAL)
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pt.c#12 (text+ko) ====
@@ -366,6 +366,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
if (SID_TYPE(&cgd->inq_data) != T_PROCESSOR)
break;
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sa.c#18 (text+ko) ====
@@ -1398,6 +1398,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
if (SID_TYPE(&cgd->inq_data) != T_SEQUENTIAL)
break;
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#19 (text+ko) ====
@@ -251,6 +251,9 @@
break;
}
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
inq_len = cgd->inq_data.additional_length + 4;
/*
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sg.c#12 (text+ko) ====
@@ -226,6 +226,9 @@
if (cgd == NULL)
break;
+ if (cgd->protocol != PROTO_SCSI)
+ break;
+
/*
* Allocate a peripheral instance for this device and
* start the probe process.
More information about the p4-projects
mailing list