summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ata/atascsi.c16
-rw-r--r--sys/dev/ata/atascsi.h3
-rw-r--r--sys/dev/ic/ami.c14
-rw-r--r--sys/scsi/scsi_all.h48
-rw-r--r--sys/scsi/sd.c4
5 files changed, 65 insertions, 20 deletions
diff --git a/sys/dev/ata/atascsi.c b/sys/dev/ata/atascsi.c
index 45a4c5c089c..1fe99ac16ad 100644
--- a/sys/dev/ata/atascsi.c
+++ b/sys/dev/ata/atascsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.c,v 1.54 2007/12/09 01:30:59 dlg Exp $ */
+/* $OpenBSD: atascsi.c,v 1.55 2007/12/28 16:19:14 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -553,17 +553,17 @@ atascsi_disk_serial(struct scsi_xfer *xs)
struct scsi_link *link = xs->sc_link;
struct atascsi *as = link->adapter_softc;
struct ata_port *ap = as->as_ports[link->target];
- struct scsi_inquiry_vpd vpd;
+ struct scsi_vpd_serial pg;
- bzero(&vpd, sizeof(vpd));
+ bzero(&pg, sizeof(pg));
- vpd.device = T_DIRECT;
- vpd.page_code = SI_PG_SERIAL;
- vpd.page_length = sizeof(ap->ap_identify.serial);
- bcopy(ap->ap_identify.serial, vpd.serial,
+ pg.hdr.device = T_DIRECT;
+ pg.hdr.page_code = SI_PG_SERIAL;
+ pg.hdr.page_length = sizeof(ap->ap_identify.serial);
+ bcopy(ap->ap_identify.serial, pg.serial,
sizeof(ap->ap_identify.serial));
- bcopy(&vpd, xs->data, MIN(sizeof(vpd), xs->datalen));
+ bcopy(&pg, xs->data, MIN(sizeof(pg), xs->datalen));
return (atascsi_done(xs, XS_NOERROR));
}
diff --git a/sys/dev/ata/atascsi.h b/sys/dev/ata/atascsi.h
index 58de6156786..39472937452 100644
--- a/sys/dev/ata/atascsi.h
+++ b/sys/dev/ata/atascsi.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.h,v 1.30 2007/12/06 12:19:01 jsg Exp $ */
+/* $OpenBSD: atascsi.h,v 1.31 2007/12/28 16:19:14 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -93,6 +93,7 @@ struct ata_identify {
u_int16_t features85; /* 85 */
u_int16_t features86; /* 86 */
u_int16_t features87; /* 87 */
+#define ATA_ID_F87_WWN (1<<8)
u_int16_t ultradma; /* 88 */
u_int16_t erasetime; /* 89 */
u_int16_t erasetimex; /* 90 */
diff --git a/sys/dev/ic/ami.c b/sys/dev/ic/ami.c
index 8f5669e4dd3..f1858af47cc 100644
--- a/sys/dev/ic/ami.c
+++ b/sys/dev/ic/ami.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ami.c,v 1.185 2007/09/27 08:45:19 chl Exp $ */
+/* $OpenBSD: ami.c,v 1.186 2007/12/28 16:19:14 dlg Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -2013,7 +2013,7 @@ ami_disk(struct ami_softc *sc, struct bioc_disk *bd,
struct ami_big_diskarray *p)
{
struct scsi_inquiry_data inqbuf;
- struct scsi_inquiry_vpd vpdbuf;
+ struct scsi_vpd_serial vpdbuf;
char *plist;
int i, s, t, off;
int ld = p->ada_nld, error = EINVAL;
@@ -2073,8 +2073,8 @@ ami_disk(struct ami_softc *sc, struct bioc_disk *bd,
bcopy(vpdbuf.serial, ser, sizeof ser - 1);
ser[sizeof ser - 1] = '\0';
- if (vpdbuf.page_length < sizeof ser)
- ser[vpdbuf.page_length] = '\0';
+ if (vpdbuf.hdr.page_length < sizeof ser)
+ ser[vpdbuf.hdr.page_length] = '\0';
strlcpy(bd->bd_serial, ser, sizeof(bd->bd_serial));
}
@@ -2233,7 +2233,7 @@ int
ami_ioctl_disk(struct ami_softc *sc, struct bioc_disk *bd)
{
struct scsi_inquiry_data inqbuf;
- struct scsi_inquiry_vpd vpdbuf;
+ struct scsi_vpd_serial vpdbuf;
struct ami_big_diskarray *p; /* struct too large for stack */
int i, s, t, d;
int off;
@@ -2313,8 +2313,8 @@ ami_ioctl_disk(struct ami_softc *sc, struct bioc_disk *bd)
bcopy(vpdbuf.serial, ser, sizeof ser - 1);
ser[sizeof ser - 1] = '\0';
- if (vpdbuf.page_length < sizeof ser)
- ser[vpdbuf.page_length] = '\0';
+ if (vpdbuf.hdr.page_length < sizeof ser)
+ ser[vpdbuf.hdr.page_length] = '\0';
strlcpy(bd->bd_serial, ser,
sizeof(bd->bd_serial));
}
diff --git a/sys/scsi/scsi_all.h b/sys/scsi/scsi_all.h
index 0a79d2622ec..5eb63b5de24 100644
--- a/sys/scsi/scsi_all.h
+++ b/sys/scsi/scsi_all.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_all.h,v 1.43 2007/04/12 16:33:27 weingart Exp $ */
+/* $OpenBSD: scsi_all.h,v 1.44 2007/12/28 16:19:15 dlg Exp $ */
/* $NetBSD: scsi_all.h,v 1.10 1996/09/12 01:57:17 thorpej Exp $ */
/*
@@ -82,7 +82,9 @@ struct scsi_inquiry {
u_int8_t flags;
#define SI_EVPD 0x01
u_int8_t pagecode;
+#define SI_PG_SUPPORTED 0x00
#define SI_PG_SERIAL 0x80
+#define SI_PG_DEVID 0x83
u_int8_t length[2];
u_int8_t control;
};
@@ -257,14 +259,56 @@ struct scsi_inquiry_data {
u_int8_t reserved;
};
-struct scsi_inquiry_vpd {
+struct scsi_vpd_hdr {
u_int8_t device;
u_int8_t page_code;
u_int8_t reserved;
u_int8_t page_length;
+};
+
+struct scsi_vpd_serial {
+ struct scsi_vpd_hdr hdr;
char serial[32];
};
+#define VPD_PROTO_ID_FC 0x0 /* Fibre Channel */
+#define VPD_PROTO_ID_SPI 0x1 /* Parallel SCSI */
+#define VPD_PROTO_ID_SSA 0x2
+#define VPD_PROTO_ID_IEEE1394 0x3
+#define VPD_PROTO_ID_SRP 0x4 /* SCSI RDMA Protocol */
+#define VPD_PROTO_ID_ISCSI 0x5 /* Internet SCSI (iSCSI) */
+#define VPD_PROTO_ID_SAS 0x6 /* Serial Attached SCSI */
+#define VPD_PROTO_ID_ADT 0x7 /* Automation/Drive Interface Transport */
+#define VPD_PROTO_ID_ATA 0x7 /* ATA/ATAPI */
+#define VPD_PROTO_ID_NONE 0xf
+
+struct scsi_vpd_devid_hdr {
+ u_int8_t pi_code;
+#define VPD_DEVID_PI(_f) (((_f) >> 4) & 0xf0)
+#define VPD_DEVID_CODE(_f) (((_f) >> 0) & 0x0f)
+#define VPD_DEVID_CODE_BINARY 0x1
+#define VPD_DEVID_CODE_ASCII 0x2
+#define VPD_DEVID_CODE_UTF8 0x3
+ u_int8_t flags;
+#define VPD_DEVID_PIV 0x80
+#define VPD_DEVID_ASSOC 0x30
+#define VPD_DEVID_ASSOC_LU 0x00
+#define VPD_DEVID_ASSOC_PORT 0x10
+#define VPD_DEVID_ASSOC_TARG 0x20
+#define VPD_DEVID_TYPE (((_f) >> 0) & 0x0f)
+#define VPD_DEVID_TYPE_VENDOR 0x0
+#define VPD_DEVID_TYPE_T10 0x1
+#define VPD_DEVID_TYPE_EUI64 0x2
+#define VPD_DEVID_TYPE_NAA 0x3
+#define VPD_DEVID_TYPE_RELATIVE 0x4
+#define VPD_DEVID_TYPE_PORT 0x5
+#define VPD_DEVID_TYPE_LU 0x6
+#define VPD_DEVID_TYPE_MD5 0x7
+#define VPD_DEVID_TYPE_NAME 0x8
+ u_int8_t reserved;
+ u_int8_t len;
+};
+
struct scsi_sense_data_unextended {
/* 1*/ u_int8_t error_code;
/* 4*/ u_int8_t block[3];
diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c
index 5337ed16285..290b7832f6a 100644
--- a/sys/scsi/sd.c
+++ b/sys/scsi/sd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sd.c,v 1.140 2007/11/23 14:44:59 dlg Exp $ */
+/* $OpenBSD: sd.c,v 1.141 2007/12/28 16:19:15 dlg Exp $ */
/* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */
/*-
@@ -967,7 +967,7 @@ sdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
int
sd_ioctl_inquiry(struct sd_softc *sd, struct dk_inquiry *di)
{
- struct scsi_inquiry_vpd vpd;
+ struct scsi_vpd_serial vpd;
bzero(di, sizeof(struct dk_inquiry));
scsi_strvis(di->vendor, sd->sc_link->inqdata.vendor,