Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Feb 2019 01:24:10 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r343728 - head/usr.sbin/sesutil
Message-ID:  <201902040124.x141OAWw052449@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Feb  4 01:24:10 2019
New Revision: 343728
URL: https://svnweb.freebsd.org/changeset/base/343728

Log:
  Check element type before setting LEDs.
  
  With r319610, sesutil started twiddling the bits of every SES device.
  Not everything is a disk slot, there are also fan controllers, temperature
  sensors, even power supplies, among other things controlled by SES.
  
  Add a type check to make sure we are only operating on device slot and array
  device slot elements.  Other type elements will be skipped, but it would be
  simple to add additional cases for controlling the ident LEDs of other
  element types (which are not necessarily the same bits).
  
  Rather than doing raw bit manipulation of an unstructured byte array using
  unnamed numeric constants, leverage existing code abstractions.
  
  Submitted by:	Ryan Moeller <ryan@freqlabs.com>
  MFC after:	1 week
  Sponsored by:	iXsystems, Inc.
  Differential Revision:	https://reviews.freebsd.org/D19052

Modified:
  head/usr.sbin/sesutil/sesutil.c

Modified: head/usr.sbin/sesutil/sesutil.c
==============================================================================
--- head/usr.sbin/sesutil/sesutil.c	Mon Feb  4 01:20:56 2019	(r343727)
+++ head/usr.sbin/sesutil/sesutil.c	Mon Feb  4 01:24:10 2019	(r343728)
@@ -112,28 +112,30 @@ usage(FILE *out, const char *subcmd)
 }
 
 static void
-do_led(int fd, unsigned int idx, bool onoff, bool setfault)
+do_led(int fd, unsigned int idx, elm_type_t type, bool onoff, bool setfault)
 {
+	int state = onoff ? 1 : 0;
 	encioc_elm_status_t o;
+	struct ses_ctrl_dev_slot *slot;
 
 	o.elm_idx = idx;
 	if (ioctl(fd, ENCIOC_GETELMSTAT, (caddr_t) &o) < 0) {
 		close(fd);
 		xo_err(EXIT_FAILURE, "ENCIOC_GETELMSTAT");
 	}
-	o.cstat[0] |= 0x80;
-	if (setfault) {
-		if (onoff)
-			o.cstat[3] |= 0x20;
+	slot = (struct ses_ctrl_dev_slot *) &o.cstat[0];
+	switch (type) {
+	case ELMTYP_DEVICE:
+	case ELMTYP_ARRAY_DEV:
+		ses_ctrl_common_set_select(&slot->common, 1);
+		if (setfault)
+			ses_ctrl_dev_slot_set_rqst_fault(slot, state);
 		else
-			o.cstat[3] &= 0xdf;
-	} else {
-		if (onoff)
-			o.cstat[2] |= 0x02;
-		else
-			o.cstat[2] &= 0xfd;
+			ses_ctrl_dev_slot_set_rqst_ident(slot, state);
+		break;
+	default:
+		return;
 	}
-
 	if (ioctl(fd, ENCIOC_SETELMSTAT, (caddr_t) &o) < 0) {
 		close(fd);
 		xo_err(EXIT_FAILURE, "ENCIOC_SETELMSTAT");
@@ -250,14 +252,15 @@ sesled(int argc, char **argv, bool setfault)
 				xo_errx(EXIT_FAILURE,
 				     "Requested SES ID does not exist");
 			}
-			do_led(fd, sesid, onoff, setfault);
+			do_led(fd, sesid, objp[sesid].elm_type, onoff, setfault);
 			ndisks++;
 			close(fd);
 			break;
 		}
 		for (j = 0; j < nobj; j++) {
 			if (all) {
-				do_led(fd, objp[j].elm_idx, onoff, setfault);
+				do_led(fd, objp[j].elm_idx, objp[j].elm_type,
+				    onoff, setfault);
 				continue;
 			}
 			memset(&objdn, 0, sizeof(objdn));
@@ -274,7 +277,7 @@ sesled(int argc, char **argv, bool setfault)
 			}
 			if (objdn.elm_names_len > 0) {
 				if (disk_match(objdn.elm_devnames, disk, len)) {
-					do_led(fd, objdn.elm_idx,
+					do_led(fd, objdn.elm_idx, objp[j].elm_type,
 					    onoff, setfault);
 					ndisks++;
 					break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902040124.x141OAWw052449>