svn commit: r246437 - in stable/9: share/examples/ses share/examples/ses/sesd share/examples/ses/srcs sys/cam/scsi sys/conf sys/fs/devfs sys/modules/cam usr.bin/kdump

Alexander Motin mav at FreeBSD.org
Wed Feb 6 22:07:41 UTC 2013


Author: mav
Date: Wed Feb  6 22:07:38 2013
New Revision: 246437
URL: http://svnweb.freebsd.org/changeset/base/246437

Log:
  MFC r235911, r235980, r238739, r238740, r238894, r239213, r241488, r241952,
  r242173, r242621, r242634, r242638, r242647, r242720, r244418, r244508,
  r245891:
  Revamp the CAM enclosure services driver.
  This updated driver uses an in-kernel daemon to track state changes and
  publishes physical path location information for disk elements into the
  CAM device database.
  
  Sponsored by:   Spectra Logic Corporation
  Sponsored by:   iXsystems, Inc.

Added:
  stable/9/sys/cam/scsi/scsi_enc.c
     - copied, changed from r235911, head/sys/cam/scsi/scsi_enc.c
  stable/9/sys/cam/scsi/scsi_enc.h
     - copied unchanged from r235911, head/sys/cam/scsi/scsi_enc.h
  stable/9/sys/cam/scsi/scsi_enc_internal.h
     - copied unchanged from r235911, head/sys/cam/scsi/scsi_enc_internal.h
  stable/9/sys/cam/scsi/scsi_enc_safte.c
     - copied, changed from r235911, head/sys/cam/scsi/scsi_enc_safte.c
  stable/9/sys/cam/scsi/scsi_enc_ses.c
     - copied, changed from r235911, head/sys/cam/scsi/scsi_enc_ses.c
Deleted:
  stable/9/sys/cam/scsi/scsi_ses.c
Modified:
  stable/9/share/examples/ses/Makefile.inc
  stable/9/share/examples/ses/sesd/sesd.0
  stable/9/share/examples/ses/srcs/eltsub.c
  stable/9/share/examples/ses/srcs/getencstat.c
  stable/9/share/examples/ses/srcs/getnobj.c
  stable/9/share/examples/ses/srcs/getobjmap.c
  stable/9/share/examples/ses/srcs/getobjstat.c
  stable/9/share/examples/ses/srcs/inienc.c
  stable/9/share/examples/ses/srcs/sesd.c
  stable/9/share/examples/ses/srcs/setencstat.c
  stable/9/share/examples/ses/srcs/setobjstat.c
  stable/9/sys/cam/scsi/scsi_pt.c
  stable/9/sys/cam/scsi/scsi_ses.h
  stable/9/sys/conf/files
  stable/9/sys/fs/devfs/devfs_vnops.c
  stable/9/sys/modules/cam/Makefile
  stable/9/usr.bin/kdump/mkioctls
Directory Properties:
  stable/9/share/examples/ses/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/fs/   (props changed)
  stable/9/sys/modules/   (props changed)
  stable/9/usr.bin/kdump/   (props changed)

Modified: stable/9/share/examples/ses/Makefile.inc
==============================================================================
--- stable/9/share/examples/ses/Makefile.inc	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/Makefile.inc	Wed Feb  6 22:07:38 2013	(r246437)
@@ -32,7 +32,6 @@
 # mjacob at feral.com
 #
 
-CFLAGS+= -I/usr/include/cam/scsi -DSESINC="<scsi_ses.h>"
 BINDIR?= /usr/sbin
 
 CLEANFILES+= ${MAN}

Modified: stable/9/share/examples/ses/sesd/sesd.0
==============================================================================
--- stable/9/share/examples/ses/sesd/sesd.0	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/sesd/sesd.0	Wed Feb  6 22:07:38 2013	(r246437)
@@ -31,7 +31,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 21, 2000
+.Dd November 5, 2012
 .Dt SESD 8
 .Os
 .Sh NAME
@@ -39,6 +39,7 @@
 .Nd monitor SCSI Environmental Services Devices
 .Sh SYNOPSIS
 .Nm
+.Op Fl c
 .Op Fl d
 .Op Fl t Ar poll-interval
 .Ar device
@@ -57,7 +58,9 @@ poll each device for a change in state.
 .Pp
 The following options may be used:
 .Bl -tag -width Ds
-.It Fl p Ar poll-interval
+.It Fl c
+Try to clear enclosure status after read.
+.It Fl t Ar poll-interval
 Change the interval of polling from the default 30 seconds to the number
 of seconds specified.
 .It Fl d

Modified: stable/9/share/examples/ses/srcs/eltsub.c
==============================================================================
--- stable/9/share/examples/ses/srcs/eltsub.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/eltsub.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,10 +33,13 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_enc.h>
 
 #include "eltsub.h"
 
@@ -46,79 +49,82 @@ geteltnm(int type)
 	static char rbuf[132];
 
 	switch (type) {
-	case SESTYP_UNSPECIFIED:
+	case ELMTYP_UNSPECIFIED:
 		sprintf(rbuf, "Unspecified");
 		break;
-	case SESTYP_DEVICE:
-		sprintf(rbuf, "Device");
+	case ELMTYP_DEVICE:
+		sprintf(rbuf, "Device Slot");
 		break;
-	case SESTYP_POWER:
-		sprintf(rbuf, "Power supply");
+	case ELMTYP_POWER:
+		sprintf(rbuf, "Power Supply");
 		break;
-	case SESTYP_FAN:
-		sprintf(rbuf, "Cooling element");
+	case ELMTYP_FAN:
+		sprintf(rbuf, "Cooling");
 		break;
-	case SESTYP_THERM:
-		sprintf(rbuf, "Temperature sensors");
+	case ELMTYP_THERM:
+		sprintf(rbuf, "Temperature Sensors");
 		break;
-	case SESTYP_DOORLOCK:
+	case ELMTYP_DOORLOCK:
 		sprintf(rbuf, "Door Lock");
 		break;
-	case SESTYP_ALARM:
+	case ELMTYP_ALARM:
 		sprintf(rbuf, "Audible alarm");
 		break;
-	case SESTYP_ESCC:
-		sprintf(rbuf, "Enclosure services controller electronics");
+	case ELMTYP_ESCC:
+		sprintf(rbuf, "Enclosure Services Controller Electronics");
 		break;
-	case SESTYP_SCC:
-		sprintf(rbuf, "SCC controller electronics");
+	case ELMTYP_SCC:
+		sprintf(rbuf, "SCC Controller Electronics");
 		break;
-	case SESTYP_NVRAM:
-		sprintf(rbuf, "Nonvolatile cache");
+	case ELMTYP_NVRAM:
+		sprintf(rbuf, "Nonvolatile Cache");
 		break;
-	case SESTYP_UPS:
-		sprintf(rbuf, "Uninterruptible power supply");
+	case ELMTYP_INV_OP_REASON:
+		sprintf(rbuf, "Invalid Operation Reason");
 		break;
-	case SESTYP_DISPLAY:
+	case ELMTYP_UPS:
+		sprintf(rbuf, "Uninterruptible Power Supply");
+		break;
+	case ELMTYP_DISPLAY:
 		sprintf(rbuf, "Display");
 		break;
-	case SESTYP_KEYPAD:
-		sprintf(rbuf, "Key pad entry device");
+	case ELMTYP_KEYPAD:
+		sprintf(rbuf, "Key Pad Entry");
 		break;
-	case SESTYP_ENCLOSURE:
+	case ELMTYP_ENCLOSURE:
 		sprintf(rbuf, "Enclosure");
 		break;
-	case SESTYP_SCSIXVR:
-		sprintf(rbuf, "SCSI port/transceiver");
+	case ELMTYP_SCSIXVR:
+		sprintf(rbuf, "SCSI Port/Transceiver");
 		break;
-	case SESTYP_LANGUAGE:
+	case ELMTYP_LANGUAGE:
 		sprintf(rbuf, "Language");
 		break;
-	case SESTYP_COMPORT:
+	case ELMTYP_COMPORT:
 		sprintf(rbuf, "Communication Port");
 		break;
-	case SESTYP_VOM:
+	case ELMTYP_VOM:
 		sprintf(rbuf, "Voltage Sensor");
 		break;
-	case SESTYP_AMMETER:
+	case ELMTYP_AMMETER:
 		sprintf(rbuf, "Current Sensor");
 		break;
-	case SESTYP_SCSI_TGT:
-		sprintf(rbuf, "SCSI target port");
+	case ELMTYP_SCSI_TGT:
+		sprintf(rbuf, "SCSI Target Port");
 		break;
-	case SESTYP_SCSI_INI:
-		sprintf(rbuf, "SCSI initiator port");
+	case ELMTYP_SCSI_INI:
+		sprintf(rbuf, "SCSI Initiator Port");
 		break;
-	case SESTYP_SUBENC:
-		sprintf(rbuf, "Simple sub-enclosure");
+	case ELMTYP_SUBENC:
+		sprintf(rbuf, "Simple Subenclosure");
 		break;
-	case SESTYP_ARRAY:
-		sprintf(rbuf, "Array device");
+	case ELMTYP_ARRAY_DEV:
+		sprintf(rbuf, "Array Device Slot");
 		break;
-	case SESTYP_SASEXPANDER:
+	case ELMTYP_SAS_EXP:
 		sprintf(rbuf, "SAS Expander");
 		break;
-	case SESTYP_SASCONNECTOR:
+	case ELMTYP_SAS_CONN:
 		sprintf(rbuf, "SAS Connector");
 		break;
 	default:
@@ -134,31 +140,34 @@ scode2ascii(u_char code)
 	static char rbuf[32];
 	switch (code & 0xf) {
 	case SES_OBJSTAT_UNSUPPORTED:
-		sprintf(rbuf, "status not supported");
+		sprintf(rbuf, "Unsupported");
 		break;
 	case SES_OBJSTAT_OK:
-		sprintf(rbuf, "ok");
+		sprintf(rbuf, "OK");
 		break;
 	case SES_OBJSTAT_CRIT:
-		sprintf(rbuf, "critical");
+		sprintf(rbuf, "Critical");
 		break;
 	case SES_OBJSTAT_NONCRIT:
-		sprintf(rbuf, "non-critical");
+		sprintf(rbuf, "Noncritical");
 		break;
 	case SES_OBJSTAT_UNRECOV:
-		sprintf(rbuf, "unrecoverable");
+		sprintf(rbuf, "Unrecoverable");
 		break;
 	case SES_OBJSTAT_NOTINSTALLED:
-		sprintf(rbuf, "not installed");
+		sprintf(rbuf, "Not Installed");
 		break;
 	case SES_OBJSTAT_UNKNOWN:
-		sprintf(rbuf, "unknown status");
+		sprintf(rbuf, "Unknown");
 		break;
 	case SES_OBJSTAT_NOTAVAIL:
-		sprintf(rbuf, "status not available");
+		sprintf(rbuf, "Not Available");
+		break;
+	case SES_OBJSTAT_NOACCESS:
+		sprintf(rbuf, "No Access Allowed");
 		break;
 	default:
-		sprintf(rbuf, "unknown status code %x", code & 0xf);
+		sprintf(rbuf, "<Status 0x%x>", code & 0xf);
 		break;
 	}
 	return (rbuf);
@@ -171,7 +180,11 @@ stat2ascii(int eletype __unused, u_char 
 	static char ebuf[256], *scode;
 
 	scode = scode2ascii(cstat[0]);
-	sprintf(ebuf, "Status=%s (bytes=0x%02x 0x%02x 0x%02x 0x%02x)",
-	    scode, cstat[0], cstat[1], cstat[2], cstat[3]);
+	sprintf(ebuf, "status: %s%s%s%s (0x%02x 0x%02x 0x%02x 0x%02x)",
+	    scode,
+	    (cstat[0] & 0x40) ? ", Prd.Fail" : "",
+	    (cstat[0] & 0x20) ? ", Disabled" : "",
+	    (cstat[0] & 0x10) ? ", Swapped" : "",
+	    cstat[0], cstat[1], cstat[2], cstat[3]);
 	return (ebuf);
 }

Modified: stable/9/share/examples/ses/srcs/getencstat.c
==============================================================================
--- stable/9/share/examples/ses/srcs/getencstat.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/getencstat.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,20 +33,25 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_enc.h>
 
 #include "eltsub.h"
 
 int
 main(int a, char **v)
 {
-	ses_object *objp;
-	ses_objstat ob;
+	encioc_element_t *objp;
+	encioc_elm_status_t ob;
+	encioc_elm_desc_t objd;
+	encioc_elm_devnames_t objdn;
 	int fd, nobj, f, i, verbose, quiet, errors;
 	u_char estat;
 
@@ -73,13 +78,13 @@ main(int a, char **v)
 			perror(*v);
 			continue;
 		}
-		if (ioctl(fd, SESIOC_GETNOBJ, (caddr_t) &nobj) < 0) {
-			perror("SESIOC_GETNOBJ");
+		if (ioctl(fd, ENCIOC_GETNELM, (caddr_t) &nobj) < 0) {
+			perror("ENCIOC_GETNELM");
 			(void) close(fd);
 			continue;
 		}
-		if (ioctl(fd, SESIOC_GETENCSTAT, (caddr_t) &estat) < 0) {
-			perror("SESIOC_GETENCSTAT");
+		if (ioctl(fd, ENCIOC_GETENCSTAT, (caddr_t) &estat) < 0) {
+			perror("ENCIOC_GETENCSTAT");
 			(void) close(fd);
 			continue;
 		}
@@ -113,38 +118,64 @@ main(int a, char **v)
 			}
 		}
 		fprintf(stdout, ">\n");
-		objp = calloc(nobj, sizeof (ses_object));
+		objp = calloc(nobj, sizeof (encioc_element_t));
 		if (objp == NULL) {
 			perror("calloc");
 			(void) close(fd);
 			continue;
 		}
-                if (ioctl(fd, SESIOC_GETOBJMAP, (caddr_t) objp) < 0) {
-                        perror("SESIOC_GETOBJMAP");
+                if (ioctl(fd, ENCIOC_GETELMMAP, (caddr_t) objp) < 0) {
+                        perror("ENCIOC_GETELMMAP");
                         (void) close(fd);
                         continue;
                 }
 		for (i = 0; i < nobj; i++) {
-			ob.obj_id = objp[i].obj_id;
-			if (ioctl(fd, SESIOC_GETOBJSTAT, (caddr_t) &ob) < 0) {
-				perror("SESIOC_GETOBJSTAT");
+			ob.elm_idx = objp[i].elm_idx;
+			if (ioctl(fd, ENCIOC_GETELMSTAT, (caddr_t) &ob) < 0) {
+				perror("ENCIOC_GETELMSTAT");
 				(void) close(fd);
 				break;
 			}
-			if ((ob.cstat[0] & 0xf) == SES_OBJSTAT_OK) {
-				if (verbose) {
-					fprintf(stdout,
-					    "Element 0x%x: %s OK (%s)\n",
-					    ob.obj_id,
-					    geteltnm(objp[i].object_type),
-					    stat2ascii(objp[i].object_type,
-					    ob.cstat));
-				}
+			bzero(&objd, sizeof(objd));
+			objd.elm_idx = objp[i].elm_idx;
+			objd.elm_desc_len = UINT16_MAX;
+			objd.elm_desc_str = calloc(UINT16_MAX, sizeof(char));
+			if (objd.elm_desc_str == NULL) {
+				perror("calloc");
+				(void) close(fd);
 				continue;
 			}
-			fprintf(stdout, "Element 0x%x: %s, %s\n",
-			    ob.obj_id, geteltnm(objp[i].object_type),
-			    stat2ascii(objp[i].object_type, ob.cstat));
+			if (ioctl(fd, ENCIOC_GETELMDESC, (caddr_t)&objd) < 0) {
+				perror("ENCIOC_GETELMDESC");
+				(void) close(fd);
+				break;
+			}
+			bzero(&objdn, sizeof(objdn));
+			objdn.elm_idx = objp[i].elm_idx;
+			objdn.elm_names_size = 128;
+			objdn.elm_devnames = calloc(128, sizeof(char));
+			if (objdn.elm_devnames == NULL) {
+				perror("calloc");
+				(void) close(fd);
+				break;
+			}
+			/*
+			 * This ioctl isn't critical and has a good chance
+			 * of returning -1.
+			 */
+			(void)ioctl(fd, ENCIOC_GETELMDEVNAMES, (caddr_t)&objdn);
+			fprintf(stdout, "Element 0x%x: %s", ob.elm_idx,
+			    geteltnm(objp[i].elm_type));
+			fprintf(stdout, ", %s",
+			    stat2ascii(objp[i].elm_type, ob.cstat));
+			if (objd.elm_desc_len > 0)
+				fprintf(stdout, ", descriptor: '%s'",
+				    objd.elm_desc_str);
+			if (objdn.elm_names_len > 0)
+				fprintf(stdout, ", dev: '%s'",
+				    objdn.elm_devnames);
+			fprintf(stdout, "\n");
+			free(objdn.elm_devnames);
 		}
 		free(objp);
 		(void) close(fd);

Modified: stable/9/share/examples/ses/srcs/getnobj.c
==============================================================================
--- stable/9/share/examples/ses/srcs/getnobj.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/getnobj.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,12 +33,15 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_ses.h>
 
 int
 main(int argc, char **argv)

Modified: stable/9/share/examples/ses/srcs/getobjmap.c
==============================================================================
--- stable/9/share/examples/ses/srcs/getobjmap.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/getobjmap.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,11 +33,14 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_ses.h>
 
 #include "eltsub.h"
 

Modified: stable/9/share/examples/ses/srcs/getobjstat.c
==============================================================================
--- stable/9/share/examples/ses/srcs/getobjstat.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/getobjstat.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -32,11 +32,14 @@
  * mjacob at feral.com
  */
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_ses.h>
 
 int
 main(int a, char **v)

Modified: stable/9/share/examples/ses/srcs/inienc.c
==============================================================================
--- stable/9/share/examples/ses/srcs/inienc.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/inienc.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,11 +33,14 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_ses.h>
 
 int
 main(int a, char **v)

Modified: stable/9/share/examples/ses/srcs/sesd.c
==============================================================================
--- stable/9/share/examples/ses/srcs/sesd.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/sesd.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -32,14 +32,18 @@
  * mjacob at feral.com
  */
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <string.h>
 #include <syslog.h>
+#include <unistd.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_enc.h>
 
 #define	ALLSTAT (SES_ENCSTAT_UNRECOV | SES_ENCSTAT_CRITICAL | \
 	SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO)
@@ -52,29 +56,33 @@ int
 main(int a, char **v)
 {
 	static const char *usage =
-	    "usage: %s [ -d ] [ -t pollinterval ] device [ device ]\n";
-	int fd, polltime, dev, devbase, nodaemon;
-	ses_encstat stat, *carray;
+	    "usage: %s [ -c ] [ -d ] [ -t pollinterval ] device [ device ]\n";
+	int fd, polltime, dev, nodaemon, clear, c;
+	encioc_enc_status_t stat, nstat, *carray;
 
 	if (a < 2) {
 		fprintf(stderr, usage, *v);
 		return (1);
 	}
 
-	devbase = 1;
-
-	if (strcmp(v[1], "-d") == 0) {
-		nodaemon = 1;
-		devbase++;
-	} else {
-		nodaemon = 0;
-	}
-
-	if (a > 2 && strcmp(v[2], "-t") == 0) {
-		devbase += 2;
-		polltime = atoi(v[3]);
-	} else {
-		polltime = 30;
+	nodaemon = 0;
+	polltime = 30;
+	clear = 0;
+	while ((c = getopt(a, v, "cdt:")) != -1) {
+		switch (c) {
+		case 'c':
+			clear = 1;
+			break;
+		case 'd':
+			nodaemon = 1;
+			break;
+		case 't':
+			polltime = atoi(optarg);
+			break;
+		default:
+			fprintf(stderr, usage, *v);
+			return (1);
+		}
 	}
 
 	carray = malloc(a);
@@ -82,20 +90,20 @@ main(int a, char **v)
 		perror("malloc");
 		return (1);
 	}
-	for (dev = devbase; dev < a; dev++)
-		carray[dev] = (ses_encstat) -1;
+	for (dev = optind; dev < a; dev++)
+		carray[dev] = (encioc_enc_status_t) -1;
 
 	/*
 	 * Check to make sure we can open all devices
 	 */
-	for (dev = devbase; dev < a; dev++) {
+	for (dev = optind; dev < a; dev++) {
 		fd = open(v[dev], O_RDWR);
 		if (fd < 0) {
 			perror(v[dev]);
 			return (1);
 		}
-		if (ioctl(fd, SESIOC_INIT, NULL) < 0) {
-			fprintf(stderr, "%s: SESIOC_INIT fails- %s\n",
+		if (ioctl(fd, ENCIOC_INIT, NULL) < 0) {
+			fprintf(stderr, "%s: ENCIOC_INIT fails- %s\n",
 			    v[dev], strerror(errno));
 			return (1);
 		}
@@ -112,7 +120,7 @@ main(int a, char **v)
 	}
 
 	for (;;) {
-		for (dev = devbase; dev < a; dev++) {
+		for (dev = optind; dev < a; dev++) {
 			fd = open(v[dev], O_RDWR);
 			if (fd < 0) {
 				syslog(LOG_ERR, "%s: %m", v[dev]);
@@ -122,12 +130,20 @@ main(int a, char **v)
 			/*
 			 * Get the actual current enclosure status.
 			 */
-			if (ioctl(fd, SESIOC_GETENCSTAT, (caddr_t) &stat) < 0) {
+			if (ioctl(fd, ENCIOC_GETENCSTAT, (caddr_t) &stat) < 0) {
 				syslog(LOG_ERR,
-				    "%s: SESIOC_GETENCSTAT- %m", v[dev]);
+				    "%s: ENCIOC_GETENCSTAT- %m", v[dev]);
 				(void) close(fd);
 				continue;
 			}
+			if (stat != 0 && clear) {
+				nstat = 0;
+				if (ioctl(fd, ENCIOC_SETENCSTAT,
+				    (caddr_t) &nstat) < 0) {
+					syslog(LOG_ERR,
+					    "%s: ENCIOC_SETENCSTAT- %m", v[dev]);
+				}
+			}
 			(void) close(fd);
 
 			if (stat == carray[dev])
@@ -139,9 +155,8 @@ main(int a, char **v)
 				    "%s: Enclosure Status OK", v[dev]);
 			}
 			if (stat & SES_ENCSTAT_INFO) {
-				syslog(LOG_INFO,
-				    "%s: Enclosure Status Has Information",
-				    v[dev]);
+				syslog(LOG_NOTICE,
+				    "%s: Enclosure Has Information", v[dev]);
 			}
 			if (stat & SES_ENCSTAT_NONCRITICAL) {
 				syslog(LOG_WARNING,

Modified: stable/9/share/examples/ses/srcs/setencstat.c
==============================================================================
--- stable/9/share/examples/ses/srcs/setencstat.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/setencstat.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,18 +33,21 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_enc.h>
 
 int
 main(int a, char **v)
 {
 	int fd;
 	long val;
-	ses_encstat stat;
+	encioc_enc_status_t stat;
 
 	if (a != 3) {
 		fprintf(stderr, "usage: %s device enclosure_status\n", *v);
@@ -57,9 +60,9 @@ main(int a, char **v)
 	}
 	
 	val =  strtol(v[2], NULL, 0);
-	stat = (ses_encstat) val;
-	if (ioctl(fd, SESIOC_SETENCSTAT, (caddr_t) &stat) < 0) {
-		perror("SESIOC_SETENCSTAT");
+	stat = (encioc_enc_status_t)val;
+	if (ioctl(fd, ENCIOC_SETENCSTAT, (caddr_t) &stat) < 0) {
+		perror("ENCIOC_SETENCSTAT");
 	}
 	(void) close(fd);
 	return (0);

Modified: stable/9/share/examples/ses/srcs/setobjstat.c
==============================================================================
--- stable/9/share/examples/ses/srcs/setobjstat.c	Wed Feb  6 19:16:25 2013	(r246436)
+++ stable/9/share/examples/ses/srcs/setobjstat.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -33,18 +33,21 @@
  */
 
 #include <unistd.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include SESINC
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_enc.h>
 
 int
 main(int a, char **v)
 {
 	int fd;
 	int i;
-	ses_objstat obj;
+	encioc_elm_status_t obj;
 	long cvt;
 	char *x;
 
@@ -64,7 +67,7 @@ usage:
 	if (x == v[2]) {
 		goto usage;
 	}
-	obj.obj_id = cvt;
+	obj.elm_idx = cvt;
 	for (i = 0; i < 4; i++) {
 		x = v[3 + i];
 		cvt = strtol(v[3 + i],  &x, 0);
@@ -73,8 +76,8 @@ usage:
 		}
 		obj.cstat[i] = cvt;
 	}
-	if (ioctl(fd, SESIOC_SETOBJSTAT, (caddr_t) &obj) < 0) {
-		perror("SESIOC_SETOBJSTAT");
+	if (ioctl(fd, ENCIOC_SETELMSTAT, (caddr_t) &obj) < 0) {
+		perror("ENCIOC_SETELMSTAT");
 	}
 	(void) close(fd);
 	return (0);

Copied and modified: stable/9/sys/cam/scsi/scsi_enc.c (from r235911, head/sys/cam/scsi/scsi_enc.c)
==============================================================================
--- head/sys/cam/scsi/scsi_enc.c	Thu May 24 14:07:44 2012	(r235911, copy source)
+++ stable/9/sys/cam/scsi/scsi_enc.c	Wed Feb  6 22:07:38 2013	(r246437)
@@ -56,15 +56,10 @@ __FBSDID("$FreeBSD$");
 #include <cam/scsi/scsi_enc.h>
 #include <cam/scsi/scsi_enc_internal.h>
 
-#include <opt_enc.h>
-
 MALLOC_DEFINE(M_SCSIENC, "SCSI ENC", "SCSI ENC buffers");
 
 /* Enclosure type independent driver */
 
-#define	SEN_ID		"UNISYS           SUN_SEN"
-#define	SEN_ID_LEN	24
-
 static	d_open_t	enc_open;
 static	d_close_t	enc_close;
 static	d_ioctl_t	enc_ioctl;
@@ -136,15 +131,8 @@ enc_oninvalidate(struct cam_periph *peri
 	 */
 	enc->enc_flags |= ENC_FLAG_SHUTDOWN;
 	if (enc->enc_daemon != NULL) {
-		/* Signal and wait for the ses daemon to terminate. */
+		/* Signal the ses daemon to terminate. */
 		wakeup(enc->enc_daemon);
-		/*
-		 * We're called with the SIM mutex held, but we're dropping
-		 * the update mutex here on sleep.  So we have to manually
-		 * drop the SIM mutex.
-		 */
-		cam_periph_sleep(enc->periph, enc->enc_daemon,
-				 PUSER, "thtrm", 0);
 	}
 	callout_drain(&enc->status_updater);
 
@@ -567,7 +555,7 @@ enc_runcmd(struct enc_softc *enc, char *
 		cdbl = IOCDBLEN;
 	}
 
-	ccb = cam_periph_getccb(enc->periph, 1);
+	ccb = cam_periph_getccb(enc->periph, CAM_PRIORITY_NORMAL);
 	if (enc->enc_type == ENC_SEMB_SES || enc->enc_type == ENC_SEMB_SAFT) {
 		tdlen = min(dlen, 1020);
 		tdlen = (tdlen + 3) & ~3;
@@ -635,9 +623,8 @@ enc_log(struct enc_softc *enc, const cha
 /*
  * Is this a device that supports enclosure services?
  *
- * It's a a pretty simple ruleset- if it is device type 0x0D (13), it's
- * an ENC device. If it happens to be an old UNISYS SEN device, we can
- * handle that too.
+ * It's a a pretty simple ruleset- if it is device type
+ * 0x0D (13), it's an ENCLOSURE device.
  */
 
 #define	SAFTE_START	44
@@ -664,13 +651,9 @@ enc_type(struct ccb_getdev *cgd)
 	iqd = (unsigned char *)&cgd->inq_data;
 	buflen = min(sizeof(cgd->inq_data),
 	    SID_ADDITIONAL_LENGTH(&cgd->inq_data));
-	if (buflen < 8+SEN_ID_LEN)
-		return (ENC_NONE);
 
 	if ((iqd[0] & 0x1f) == T_ENCLOSURE) {
-		if (STRNCMP(&iqd[8], SEN_ID, SEN_ID_LEN) == 0) {
-			return (ENC_SEN);
-		} else if ((iqd[2] & 0x7) > 2) {
+		if ((iqd[2] & 0x7) > 2) {
 			return (ENC_SES);
 		} else {
 			return (ENC_SES_SCSI2);
@@ -839,6 +822,7 @@ enc_daemon(void *arg)
 	}
 	enc->enc_daemon = NULL;
 	cam_periph_unlock(enc->periph);
+	cam_periph_release(enc->periph);
 	kproc_exit(0);
 }
 
@@ -849,6 +833,9 @@ enc_kproc_init(enc_softc_t *enc)
 
 	callout_init_mtx(&enc->status_updater, enc->periph->sim->mtx, 0);
 
+	if (cam_periph_acquire(enc->periph) != CAM_REQ_CMP)
+		return (ENXIO);
+
 	result = kproc_create(enc_daemon, enc, &enc->enc_daemon, /*flags*/0,
 			      /*stackpgs*/0, "enc_daemon%d",
 			      enc->periph->unit_number);
@@ -857,7 +844,8 @@ enc_kproc_init(enc_softc_t *enc)
 		cam_periph_lock(enc->periph);
 		enc->enc_vec.poll_status(enc);
 		cam_periph_unlock(enc->periph);
-	}
+	} else
+		cam_periph_release(enc->periph);
 	return (result);
 }
  
@@ -887,11 +875,6 @@ enc_ctor(struct cam_periph *periph, void
 	char *tname;
 
 	cgd = (struct ccb_getdev *)arg;
-	if (periph == NULL) {
-		printf("enc_ctor: periph was NULL!!\n");
-		goto out;
-	}
-
 	if (cgd == NULL) {
 		printf("enc_ctor: no getdev CCB, can't register device\n");
 		goto out;
@@ -920,7 +903,6 @@ enc_ctor(struct cam_periph *periph, void
 	case ENC_SEMB_SAFT:
 		err = safte_softc_init(enc);
 		break;
-	case ENC_SEN:
 	case ENC_NONE:
 	default:
 		ENC_FREE(enc);
@@ -955,7 +937,7 @@ enc_ctor(struct cam_periph *periph, void
 		err = enc_kproc_init(enc);
 		if (err) {
 			xpt_print(periph->path,
-				  "error %d string enc_daemon\n", err);
+				  "error %d starting enc_daemon\n", err);
 			goto out;
 		}
 	}
@@ -987,9 +969,6 @@ enc_ctor(struct cam_periph *periph, void
         case ENC_SES_PASSTHROUGH:
 		tname = "ENC Passthrough Device";
 		break;
-        case ENC_SEN:
-		tname = "UNISYS SEN Device (NOT HANDLED YET)";
-		break;
         case ENC_SAFT:
 		tname = "SAF-TE Compliant Device";
 		break;

Copied: stable/9/sys/cam/scsi/scsi_enc.h (from r235911, head/sys/cam/scsi/scsi_enc.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/9/sys/cam/scsi/scsi_enc.h	Wed Feb  6 22:07:38 2013	(r246437, copy of r235911, head/sys/cam/scsi/scsi_enc.h)
@@ -0,0 +1,219 @@
+/* $FreeBSD$ */
+/*-
+ * Copyright (c) 2000 by Matthew Jacob
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification, immediately at the beginning of the file.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * the GNU Public License ("GPL").
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#ifndef	_SCSI_ENC_H_
+#define	_SCSI_ENC_H_
+
+#include <cam/scsi/scsi_ses.h>
+
+#define	ENCIOC			('s' - 040)
+#define	ENCIOC_GETNELM		_IO(ENCIOC, 1)
+#define	ENCIOC_GETELMMAP	_IO(ENCIOC, 2)
+#define	ENCIOC_GETENCSTAT	_IO(ENCIOC, 3)
+#define	ENCIOC_SETENCSTAT	_IO(ENCIOC, 4)
+#define	ENCIOC_GETELMSTAT	_IO(ENCIOC, 5)
+#define	ENCIOC_SETELMSTAT	_IO(ENCIOC, 6)
+#define	ENCIOC_GETTEXT		_IO(ENCIOC, 7)
+#define	ENCIOC_INIT		_IO(ENCIOC, 8)
+#define	ENCIOC_GETELMDESC	_IO(ENCIOC, 9)
+#define	ENCIOC_GETELMDEVNAMES	_IO(ENCIOC, 10)
+#define	ENCIOC_GETSTRING	_IO(ENCIOC, 11)
+#define	ENCIOC_SETSTRING	_IO(ENCIOC, 12)
+
+/*
+ * Platform Independent Definitions for enclosure devices.
+ */
+/*
+ * SCSI Based Environmental Services Application Defines
+ *
+ * Based almost entirely on SCSI-3 ENC Revision 8A specification,
+ * but slightly abstracted as the underlying device may in fact
+ * be a SAF-TE or vendor unique device.
+ */
+/*
+ * ENC Driver Operations:
+ * (The defines themselves are platform and access method specific)
+ *
+ * ENCIOC_GETNELM
+ * ENCIOC_GETELMMAP
+ * ENCIOC_GETENCSTAT
+ * ENCIOC_SETENCSTAT
+ * ENCIOC_GETELMSTAT
+ * ENCIOC_SETELMSTAT
+ * ENCIOC_INIT
+ *
+ *
+ * An application finds out how many elements an enclosure instance
+ * is managing by performing a ENCIOC_GETNELM operation. It then
+ * performs a ENCIOC_GETELMMAP to get the map that contains the
+ * elment identifiers for all elements (see encioc_element_t below).
+ * This information is static.
+ * 
+ * The application may perform ENCIOC_GETELMSTAT operations to retrieve
+ * status on an element (see the enc_elm_status_t structure below),
+ * ENCIOC_SETELMSTAT operations to set status for an element.
+ *
+ * Similarly, overall enclosure status me be fetched or set via
+ * ENCIOC_GETENCSTAT or  ENCIOC_SETENCSTAT operations (see encioc_enc_status_t
+ * below).
+ *
+ * Readers should note that there is nothing that requires either a set
+ * or a clear operation to actually latch and do anything in the target.
+ *
+ * A ENCIOC_INIT operation causes the enclosure to be initialized.
+ */
+
+/* Element Types */
+typedef enum {
+	ELMTYP_UNSPECIFIED	= 0x00,
+	ELMTYP_DEVICE		= 0x01,
+	ELMTYP_POWER		= 0x02,
+	ELMTYP_FAN		= 0x03,
+	ELMTYP_THERM		= 0x04,
+	ELMTYP_DOORLOCK		= 0x05,
+	ELMTYP_ALARM		= 0x06,
+	ELMTYP_ESCC		= 0x07,	/* Enclosure SCC */
+	ELMTYP_SCC		= 0x08,	/* SCC */
+	ELMTYP_NVRAM		= 0x09,
+	ELMTYP_INV_OP_REASON    = 0x0a,
+	ELMTYP_UPS		= 0x0b,
+	ELMTYP_DISPLAY		= 0x0c,
+	ELMTYP_KEYPAD		= 0x0d,
+	ELMTYP_ENCLOSURE	= 0x0e,
+	ELMTYP_SCSIXVR		= 0x0f,
+	ELMTYP_LANGUAGE		= 0x10,
+	ELMTYP_COMPORT		= 0x11,
+	ELMTYP_VOM		= 0x12,
+	ELMTYP_AMMETER		= 0x13,
+	ELMTYP_SCSI_TGT		= 0x14,
+	ELMTYP_SCSI_INI		= 0x15,
+	ELMTYP_SUBENC		= 0x16,
+	ELMTYP_ARRAY_DEV	= 0x17,
+	ELMTYP_SAS_EXP		= 0x18, /* SAS expander */
+	ELMTYP_SAS_CONN		= 0x19  /* SAS connector */
+} elm_type_t;
+
+typedef struct encioc_element {
+	/* Element Index */
+	unsigned int	elm_idx;	
+
+	/* ID of SubEnclosure containing Element*/
+	unsigned int	elm_subenc_id;
+
+	/* Element Type */
+	elm_type_t	elm_type;
+} encioc_element_t;
+
+/*
+ * Overall Enclosure Status
+ */
+typedef unsigned char encioc_enc_status_t;
+
+/*
+ * Element Status
+ */
+typedef struct encioc_elm_status {
+	unsigned int	elm_idx;
+	unsigned char	cstat[4];
+} encioc_elm_status_t;
+
+/*
+ * ENC String structure, for StringIn and StringOut commands; use this with
+ * the ENCIOC_GETSTRING and ENCIOC_SETSTRING ioctls.
+ */
+typedef struct encioc_string {
+	size_t bufsiz;		/* IN/OUT: length of string provided/returned */
+#define	ENC_STRING_MAX	0xffff
+	uint8_t *buf;		/* IN/OUT: string */
+} encioc_string_t;
+
+/*============================================================================*/
+
+/* 
+ * SES v2 r20 6.1.10 (pg 39) - Element Descriptor diagnostic page
+ * Tables 21, 22, and 23
+ */
+typedef struct encioc_elm_desc {
+	unsigned int	 elm_idx;       /* IN: elment requested */
+	uint16_t	 elm_desc_len; /* IN: buffer size; OUT: bytes written */
+	char		*elm_desc_str; /* IN/OUT: buffer for descriptor data */
+} encioc_elm_desc_t;
+
+/*
+ * ENCIOC_GETELMDEVNAMES:
+ * ioctl structure to get an element's device names, if available
+ */
+typedef struct  encioc_elm_devnames {
+	unsigned int	 elm_idx;	/* IN: element index */
+	size_t		 elm_names_size;/* IN: size of elm_devnames */
+	size_t		 elm_names_len;	/* OUT: actual size returned */
+	/*
+	 * IN/OUT: comma separated list of peripheral driver
+	 * instances servicing this element.
+	 */
+	char		*elm_devnames;
+} encioc_elm_devnames_t;
+
+/* ioctl structure for requesting FC info for a port */
+typedef struct encioc_elm_fc_port {
+	unsigned int		elm_idx;
+	unsigned int		port_idx;
+	struct ses_elm_fc_port	port_data;
+} encioc_elm_fc_port_t;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-stable-9 mailing list