PERFORCE change 160366 for review
Scott Long
scottl at FreeBSD.org
Wed Apr 8 01:12:04 PDT 2009
http://perforce.freebsd.org/chv.cgi?CH=160366
Change 160366 by scottl at scottl-deimos on 2009/04/08 08:11:49
Split xpt_alloc_device up and move part of it to scsi_xpt.c, along
with xpt_devise_transport.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#82 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#14 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_xpt.c#8 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#82 (text+ko) ====
@@ -224,9 +224,6 @@
static struct cam_et*
xpt_alloc_target(struct cam_eb *bus, target_id_t target_id);
static void xpt_release_target(struct cam_eb *bus, struct cam_et *target);
-static struct cam_ed*
- xpt_alloc_device(struct cam_eb *bus, struct cam_et *target,
- lun_id_t lun_id);
static void xpt_release_device(struct cam_eb *bus, struct cam_et *target,
struct cam_ed *device);
static u_int32_t xpt_dev_ccbq_resize(struct cam_path *path, int newopenings);
@@ -2644,8 +2641,8 @@
cgds->devq_queued = dev->ccbq.queue.entries;
cgds->held = dev->ccbq.held;
cgds->last_reset = tar->last_reset;
- cgds->maxtags = dev->quirk->maxtags;
- cgds->mintags = dev->quirk->mintags;
+ cgds->maxtags = dev->maxtags;
+ cgds->mintags = dev->mintags;
if (timevalcmp(&tar->last_reset, &bus->last_reset, <))
cgds->last_reset = bus->last_reset;
cgds->ccb_h.status = CAM_REQ_CMP;
@@ -3460,9 +3457,10 @@
/* Create one */
struct cam_ed *new_device;
- new_device = xpt_alloc_device(bus,
- target,
- lun_id);
+ new_device =
+ (*(bus->xport->xpt_alloc_device))(bus,
+ target,
+ lun_id);
if (new_device == NULL) {
status = CAM_RESRC_UNAVAIL;
} else {
@@ -4365,10 +4363,9 @@
}
}
-static struct cam_ed *
+struct cam_ed *
xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
{
- struct cam_path path;
struct cam_ed *device;
struct cam_devq *devq;
cam_status status;
@@ -4385,8 +4382,6 @@
}
if (device != NULL) {
- struct cam_ed *cur_device;
-
cam_init_pinfo(&device->alloc_ccb_entry.pinfo);
device->alloc_ccb_entry.device = device;
cam_init_pinfo(&device->send_ccb_entry.pinfo);
@@ -4409,16 +4404,6 @@
SLIST_INIT(&device->periphs);
device->generation = 0;
device->owner = NULL;
- /*
- * Take the default quirk entry until we have inquiry
- * data and can determine a better quirk to use.
- */
- device->quirk = &xpt_quirk_table[xpt_quirk_table_size - 1];
- bzero(&device->inq_data, sizeof(device->inq_data));
- device->inq_flags = 0;
- device->queue_flags = 0;
- device->serial_num = NULL;
- device->serial_num_len = 0;
device->qfrozen_cnt = 0;
device->flags = CAM_DEV_UNCONFIGURED;
device->tag_delay_count = 0;
@@ -4435,30 +4420,6 @@
*/
target->refcount++;
- /*
- * XXX should be limited by number of CCBs this bus can
- * do.
- */
- bus->sim->max_ccbs += device->ccbq.devq_openings;
- /* Insertion sort into our target's device list */
- cur_device = TAILQ_FIRST(&target->ed_entries);
- while (cur_device != NULL && cur_device->lun_id < lun_id)
- cur_device = TAILQ_NEXT(cur_device, links);
- if (cur_device != NULL) {
- TAILQ_INSERT_BEFORE(cur_device, device, links);
- } else {
- TAILQ_INSERT_TAIL(&target->ed_entries, device, links);
- }
- target->generation++;
- if (lun_id != CAM_LUN_WILDCARD) {
- xpt_compile_path(&path,
- NULL,
- bus->path_id,
- target->target_id,
- lun_id);
- xpt_devise_transport(&path);
- xpt_release_path(&path);
- }
}
return (device);
}
@@ -4564,86 +4525,6 @@
return (device);
}
-void
-xpt_devise_transport(struct cam_path *path)
-{
- struct ccb_pathinq cpi;
- struct ccb_trans_settings cts;
- struct scsi_inquiry_data *inq_buf;
-
- /* Get transport information from the SIM */
- xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1);
- cpi.ccb_h.func_code = XPT_PATH_INQ;
- xpt_action((union ccb *)&cpi);
-
- inq_buf = NULL;
- if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0)
- inq_buf = &path->device->inq_data;
- path->device->protocol = PROTO_SCSI;
- path->device->protocol_version =
- inq_buf != NULL ? SID_ANSI_REV(inq_buf) : cpi.protocol_version;
- path->device->transport = cpi.transport;
- path->device->transport_version = cpi.transport_version;
-
- /*
- * Any device not using SPI3 features should
- * be considered SPI2 or lower.
- */
- if (inq_buf != NULL) {
- if (path->device->transport == XPORT_SPI
- && (inq_buf->spi3data & SID_SPI_MASK) == 0
- && path->device->transport_version > 2)
- path->device->transport_version = 2;
- } else {
- struct cam_ed* otherdev;
-
- for (otherdev = TAILQ_FIRST(&path->target->ed_entries);
- otherdev != NULL;
- otherdev = TAILQ_NEXT(otherdev, links)) {
- if (otherdev != path->device)
- break;
- }
-
- if (otherdev != NULL) {
- /*
- * Initially assume the same versioning as
- * prior luns for this target.
- */
- path->device->protocol_version =
- otherdev->protocol_version;
- path->device->transport_version =
- otherdev->transport_version;
- } else {
- /* Until we know better, opt for safty */
- path->device->protocol_version = 2;
- if (path->device->transport == XPORT_SPI)
- path->device->transport_version = 2;
- else
- path->device->transport_version = 0;
- }
- }
-
- /*
- * XXX
- * For a device compliant with SPC-2 we should be able
- * to determine the transport version supported by
- * scrutinizing the version descriptors in the
- * inquiry buffer.
- */
-
- /* Tell the controller what we think */
- xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1);
- cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
- cts.type = CTS_TYPE_CURRENT_SETTINGS;
- cts.transport = path->device->transport;
- cts.transport_version = path->device->transport_version;
- cts.protocol = path->device->protocol;
- cts.protocol_version = path->device->protocol_version;
- cts.proto_specific.valid = 0;
- cts.xport_specific.valid = 0;
- xpt_action((union ccb *)&cts);
-}
-
static void
xpt_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device,
int async_update)
@@ -4734,7 +4615,7 @@
if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0
|| (INQ_DATA_TQ_ENABLED(inq_data)) == 0
|| (device->queue_flags & SCP_QUEUE_DQUE) != 0
- || (device->quirk->mintags == 0)) {
+ || (device->mintags == 0)) {
/*
* Can't tag on hardware that doesn't support tags,
* doesn't have it enabled, or has broken tag support.
@@ -4980,7 +4861,7 @@
if (device->tag_saved_openings != 0)
newopenings = device->tag_saved_openings;
else
- newopenings = min(device->quirk->maxtags,
+ newopenings = min(device->maxtags,
sim->max_tagged_dev_openings);
xpt_dev_ccbq_resize(path, newopenings);
xpt_setup_ccb(&crs.ccb_h, path, /*priority*/1);
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#14 (text+ko) ====
@@ -94,8 +94,9 @@
struct periph_list periphs; /* All attached devices */
u_int generation; /* Generation number */
struct cam_periph *owner; /* Peripheral driver's ownership tag */
- struct xpt_quirk_entry *quirk; /* Oddities about this device */
- /* Storage for the inquiry data */
+ void *quirk; /* Oddities about this device */
+ u_int maxtags;
+ u_int mintags;
cam_proto protocol;
u_int protocol_version;
cam_xport transport;
@@ -169,6 +170,10 @@
struct cam_ed *device;
};
+typedef struct cam_ed * (*xpt_alloc_device_func)(struct cam_eb *bus,
+ struct cam_et *target,
+ lun_id_t lun_id);
+
#if defined(CAM_DEBUG_FLAGS) && !defined(CAMDEBUG)
#error "You must have options CAMDEBUG to use options CAM_DEBUG_FLAGS"
#endif
@@ -194,7 +199,9 @@
MALLOC_DECLARE(M_CAMXPT);
void xpt_action(union ccb *new_ccb);
-void xpt_devise_transport(struct cam_path *path);
+static struct cam_ed* xpt_alloc_device(struct cam_eb *bus,
+ struct cam_et *target,
+ lun_id_t lun_id);
void xpt_setup_ccb(struct ccb_hdr *ccb_h,
struct cam_path *path,
u_int32_t priority);
==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_xpt.c#8 (text+ko) ====
@@ -68,7 +68,7 @@
#include <machine/stdarg.h> /* for xpt_print below */
#include "opt_cam.h"
-struct xpt_quirk_entry {
+struct scsi_quirk_entry {
struct scsi_inquiry_pattern inq_pat;
u_int8_t quirks;
#define CAM_QUIRK_NOLUNS 0x01
@@ -175,7 +175,7 @@
static const char seagate[] = "SEAGATE";
static const char microp[] = "MICROP";
-static struct xpt_quirk_entry xpt_quirk_table[] =
+static struct scsi_quirk_entry scsi_quirk_table[] =
{
{
/* Reports QUEUE FULL for temporary resource shortages */
@@ -518,8 +518,8 @@
},
};
-static const int xpt_quirk_table_size =
- sizeof(xpt_quirk_table) / sizeof(*xpt_quirk_table);
+static const int scsi_quirk_table_size =
+ sizeof(scsi_quirk_table) / sizeof(*scsi_quirk_table);
static cam_status proberegister(struct cam_periph *periph,
void *arg);
@@ -536,6 +536,10 @@
struct cam_path *path, cam_flags flags,
union ccb *ccb);
static void xptscandone(struct cam_periph *periph, union ccb *done_ccb);
+static struct cam_ed *
+ scsi_alloc_device(struct cam_eb *bus, struct cam_et *target,
+ lun_id_t lun_id);
+static void scsi_devise_transport(struct cam_path *path);
static void
probe_periph_init()
@@ -1395,17 +1399,21 @@
static void
xpt_find_quirk(struct cam_ed *device)
{
+ struct scsi_quirk_entry *quirk;
caddr_t match;
match = cam_quirkmatch((caddr_t)&device->inq_data,
- (caddr_t)xpt_quirk_table,
- sizeof(xpt_quirk_table)/sizeof(*xpt_quirk_table),
- sizeof(*xpt_quirk_table), scsi_inquiry_match);
+ (caddr_t)scsi_quirk_table,
+ sizeof(scsi_quirk_table)/sizeof(*scsi__quirk_table),
+ sizeof(*scsi_quirk_table), scsi_inquiry_match);
if (match == NULL)
panic("xpt_find_quirk: device didn't match wildcard entry!!");
- device->quirk = (struct xpt_quirk_entry *)match;
+ quirk = (strut scsi_quirk_entry *)match;
+ device->quirk = quirk;
+ device->mintags = quirk->mintags;
+ device->maxtags = quirk->maxtags;
}
static int
@@ -1796,3 +1804,137 @@
free(done_ccb, M_CAMXPT);
}
+static struct cam_ed *
+scsi_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
+{
+ struct cam_path path;
+ struct scsi_quirk_entry *quirk;
+ struct cam_ed *device;
+ struct cam_ed *cur_device;
+
+ device = xpt_alloc_device(bus, target, lun_id);
+ if (device == NULL)
+ return (NULL);
+
+ /*
+ * Take the default quirk entry until we have inquiry
+ * data and can determine a better quirk to use.
+ */
+ quirk = &scsi_quirk_table[scsi_quirk_table_size - 1];
+ device->quirk = (void *)quirk;
+ device->mintags = quirk->mintags;
+ device->maxtags = quirk->maxtags;
+ bzero(&device->inq_data, sizeof(device->inq_data));
+ device->inq_flags = 0;
+ device->queue_flags = 0;
+ device->serial_num = NULL;
+ device->serial_num_len = 0;
+
+ /*
+ * XXX should be limited by number of CCBs this bus can
+ * do.
+ */
+ bus->sim->max_ccbs += device->ccbq.devq_openings;
+ /* Insertion sort into our target's device list */
+ cur_device = TAILQ_FIRST(&target->ed_entries);
+ while (cur_device != NULL && cur_device->lun_id < lun_id)
+ cur_device = TAILQ_NEXT(cur_device, links);
+ if (cur_device != NULL) {
+ TAILQ_INSERT_BEFORE(cur_device, device, links);
+ } else {
+ TAILQ_INSERT_TAIL(&target->ed_entries, device, links);
+ }
+ target->generation++;
+ if (lun_id != CAM_LUN_WILDCARD) {
+ xpt_compile_path(&path,
+ NULL,
+ bus->path_id,
+ target->target_id,
+ lun_id);
+ scsi_devise_transport(&path);
+ xpt_release_path(&path);
+ }
+
+ return (device);
+}
+
+static void
+scsi_devise_transport(struct cam_path *path)
+{
+ struct ccb_pathinq cpi;
+ struct ccb_trans_settings cts;
+ struct scsi_inquiry_data *inq_buf;
+
+ /* Get transport information from the SIM */
+ xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1);
+ cpi.ccb_h.func_code = XPT_PATH_INQ;
+ xpt_action((union ccb *)&cpi);
+
+ inq_buf = NULL;
+ if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0)
+ inq_buf = &path->device->inq_data;
+ path->device->protocol = PROTO_SCSI;
+ path->device->protocol_version =
+ inq_buf != NULL ? SID_ANSI_REV(inq_buf) : cpi.protocol_version;
+ path->device->transport = cpi.transport;
+ path->device->transport_version = cpi.transport_version;
+
+ /*
+ * Any device not using SPI3 features should
+ * be considered SPI2 or lower.
+ */
+ if (inq_buf != NULL) {
+ if (path->device->transport == XPORT_SPI
+ && (inq_buf->spi3data & SID_SPI_MASK) == 0
+ && path->device->transport_version > 2)
+ path->device->transport_version = 2;
+ } else {
+ struct cam_ed* otherdev;
+
+ for (otherdev = TAILQ_FIRST(&path->target->ed_entries);
+ otherdev != NULL;
+ otherdev = TAILQ_NEXT(otherdev, links)) {
+ if (otherdev != path->device)
+ break;
+ }
+
+ if (otherdev != NULL) {
+ /*
+ * Initially assume the same versioning as
+ * prior luns for this target.
+ */
+ path->device->protocol_version =
+ otherdev->protocol_version;
+ path->device->transport_version =
+ otherdev->transport_version;
+ } else {
+ /* Until we know better, opt for safty */
+ path->device->protocol_version = 2;
+ if (path->device->transport == XPORT_SPI)
+ path->device->transport_version = 2;
+ else
+ path->device->transport_version = 0;
+ }
+ }
+
+ /*
+ * XXX
+ * For a device compliant with SPC-2 we should be able
+ * to determine the transport version supported by
+ * scrutinizing the version descriptors in the
+ * inquiry buffer.
+ */
+
+ /* Tell the controller what we think */
+ xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1);
+ cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
+ cts.type = CTS_TYPE_CURRENT_SETTINGS;
+ cts.transport = path->device->transport;
+ cts.transport_version = path->device->transport_version;
+ cts.protocol = path->device->protocol;
+ cts.protocol_version = path->device->protocol_version;
+ cts.proto_specific.valid = 0;
+ cts.xport_specific.valid = 0;
+ xpt_action((union ccb *)&cts);
+}
+
More information about the p4-projects
mailing list