#include <sys/conf.h>
#include <sys/file.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/scsi/scsi.h>
#include <sys/scsi/adapters/scsi_vhci.h>
char *symmetric_dev_table[] = {
"IBM DDYFT",
"IBM IC",
"SEAGATE ST",
"SUN SENA",
"SUN SESS01",
"SUNW SUNWGS",
"HITACHI OPEN",
"SUN PSX1000",
"SUN SE6920",
"SUN SE6940",
"SUN StorEdge 3510",
"SUN StorEdge 3511",
"SUN StorageTek 6920",
"SUN StorageTek 6940",
"SUN StorageTek NAS",
"SUN MRA300_R",
"SUN MRA300_E",
"STEC ZeusIOPs",
NULL
};
SCSI_FAILOVER_OP(SFO_NAME_SYM, symmetric);
static int
symmetric_device_probe(struct scsi_device *sd, struct scsi_inquiry *stdinq,
void **ctpriv)
{
char **dt;
VHCI_DEBUG(6, (CE_NOTE, NULL, "!inq str: %s\n", stdinq->inq_vid));
for (dt = symmetric_dev_table; *dt; dt++)
if (strncmp(stdinq->inq_vid, *dt, strlen(*dt)) == 0)
return (SFO_DEVICE_PROBE_VHCI);
if (bcmp(&stdinq->inq_pid[9], "SUN", 3) == 0) {
if ((stdinq->inq_pid[14] == 'G' || stdinq->inq_pid[15] == 'G' ||
stdinq->inq_pid[14] == 'T' || stdinq->inq_pid[15] == 'T') &&
(stdinq->inq_dtype == DTYPE_DIRECT)) {
return (SFO_DEVICE_PROBE_VHCI);
}
}
if (bcmp(&stdinq->inq_vid[0], "ATA ", 8) == 0) {
return (SFO_DEVICE_PROBE_VHCI);
}
return (SFO_DEVICE_PROBE_PHCI);
}
static void
symmetric_device_unprobe(struct scsi_device *sd, void *ctpriv)
{
}
static int
symmetric_path_activate(struct scsi_device *sd, char *pathclass, void *ctpriv)
{
return (0);
}
static int
symmetric_path_deactivate(struct scsi_device *sd, char *pathclass,
void *ctpriv)
{
return (0);
}
static int
symmetric_path_get_opinfo(struct scsi_device *sd,
struct scsi_path_opinfo *opinfo, void *ctpriv)
{
opinfo->opinfo_rev = OPINFO_REV;
(void) strcpy(opinfo->opinfo_path_attr, "primary");
opinfo->opinfo_path_state = SCSI_PATH_ACTIVE;
opinfo->opinfo_pswtch_best = 0;
opinfo->opinfo_pswtch_worst = 0;
opinfo->opinfo_xlf_capable = 0;
opinfo->opinfo_mode = SCSI_NO_FAILOVER;
opinfo->opinfo_preferred = 1;
return (0);
}
static int
symmetric_path_ping(struct scsi_device *sd, void *ctpriv)
{
return (1);
}
static int
symmetric_analyze_sense(struct scsi_device *sd,
uint8_t *sense, void *ctpriv)
{
return (SCSI_SENSE_NOFAILOVER);
}
static int
symmetric_pathclass_next(char *cur, char **nxt, void *ctpriv)
{
if (cur == NULL) {
*nxt = PCLASS_PRIMARY;
return (0);
} else if (strcmp(cur, PCLASS_PRIMARY) == 0) {
return (ENOENT);
} else {
return (EINVAL);
}
}