[Nut-upsdev] [RFC apcsmart V3 07/18] drivers/apcsmart: adjust how firmware_table_lookup() handles 'b' and 'V'

Michal Soltys soltys at ziu.info
Sat Mar 5 10:38:24 UTC 2011


As 'b' can return different things than firmware version on some old
models, prefer 'V' over 'b'.

Signed-off-by: Michal Soltys <soltys at ziu.info>
---
 drivers/apcsmart.c |   26 +++++++++++++++-----------
 1 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/apcsmart.c b/drivers/apcsmart.c
index 917d261..ef66fce 100644
--- a/drivers/apcsmart.c
+++ b/drivers/apcsmart.c
@@ -541,27 +541,28 @@ static int firmware_table_lookup(void)
 	unsigned int	i, j;
 	char	buf[SMALLBUF];
 
-	upsdebugx(1, "Attempting firmware lookup");
+	upsdebugx(1, "Attempting firmware lookup using command 'V'");
 
-	ret = ser_send_char(upsfd, 'b');
+	ret = ser_send_char(upsfd, 'V');
 
 	if (ret != 1) {
-		upslog_with_errno(LOG_ERR, "getbaseinfo: ser_send_char failed");
+		upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_send_char failed");
 		return 0;
 	}
 
 	ret = ser_get_line(upsfd, buf, sizeof(buf), ENDCHAR, IGNCHARS, 
 		SER_WAIT_SEC, SER_WAIT_USEC);
 
-	/* see if this is an older version like an APC600 which doesn't
-	 * response to 'a' or 'b' queries
+        /*
+	 * Some UPSes support both 'V' and 'b'. As 'b' doesn't always return
+	 * firmware version, we attempt that only if 'V' doesn't work.
 	 */
 	if ((ret < 1) || (!strcmp(buf, "NA"))) {
-		upsdebugx(1, "Attempting to contact older Smart-UPS version");
-		ret = ser_send_char(upsfd, 'V');
+		upsdebugx(1, "Attempting firmware lookup using command 'b'");
+		ret = ser_send_char(upsfd, 'b');
 
 		if (ret != 1) {
-			upslog_with_errno(LOG_ERR, "getbaseinfo: ser_send_char failed");
+			upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_send_char failed");
 			return 0;
 		}
 
@@ -572,10 +573,10 @@ static int firmware_table_lookup(void)
 			upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_get_line failed");
 			return 0;
 		}
-
-		upsdebugx(2, "Firmware: [%s]", buf);
 	}
 
+	upsdebugx(2, "Firmware: [%s]", buf);
+
 	/* this will be reworked if we get a lot of these things */
 	if (!strcmp(buf, "451.2.I")) {
 		quirk_capability_overflow = 1;
@@ -612,6 +613,10 @@ static void getbaseinfo(void)
 	int	ret = 0;
 	char 	*alrts, *cmds, temp[512];
 
+	/*
+	 *  try firmware lookup first; we could start with 'a', but older models
+	 *  sometimes return other things than a command set
+	 */
 	if (firmware_table_lookup() == 1)
 		return;
 
@@ -632,7 +637,6 @@ static void getbaseinfo(void)
 		SER_WAIT_SEC, SER_WAIT_USEC);
 
 	if ((ret < 1) || (!strcmp(temp, "NA"))) {
-
 		/* We have an old dumb UPS - go to specific code for old stuff */
 		oldapcsetup();
 		return;
-- 
1.7.2.1




More information about the Nut-upsdev mailing list