From owner-svn-src-all@FreeBSD.ORG Thu Mar 26 08:38:55 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 4F18A847; Thu, 26 Mar 2015 08:38:55 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 30F8E1F5; Thu, 26 Mar 2015 08:38:55 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t2Q8ctnI034776; Thu, 26 Mar 2015 08:38:55 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t2Q8csGi034774; Thu, 26 Mar 2015 08:38:54 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201503260838.t2Q8csGi034774@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Thu, 26 Mar 2015 08:38:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r280679 - stable/10/sbin/camcontrol X-SVN-Group: stable-10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Mar 2015 08:38:55 -0000 Author: mav Date: Thu Mar 26 08:38:53 2015 New Revision: 280679 URL: https://svnweb.freebsd.org/changeset/base/280679 Log: MFC r280249: Add camcontrol subcommands to control APM and AAM levels. Sponsored by: iXsystems, Inc. Modified: stable/10/sbin/camcontrol/camcontrol.8 stable/10/sbin/camcontrol/camcontrol.c Directory Properties: stable/10/ (props changed) Modified: stable/10/sbin/camcontrol/camcontrol.8 ============================================================================== --- stable/10/sbin/camcontrol/camcontrol.8 Thu Mar 26 08:36:08 2015 (r280678) +++ stable/10/sbin/camcontrol/camcontrol.8 Thu Mar 26 08:38:53 2015 (r280679) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 31, 2014 +.Dd March 19, 2015 .Dt CAMCONTROL 8 .Os .Sh NAME @@ -239,6 +239,16 @@ .Op device id .Op generic args .Nm +.Ic apm +.Op device id +.Op generic args +.Op Fl l Ar level +.Nm +.Ic aam +.Op device id +.Op generic args +.Op Fl l Ar level +.Nm .Ic fwdownload .Op device id .Op generic args @@ -1291,6 +1301,19 @@ Value 0 disables timer. Put ATA device into SLEEP state. Note that the only way get device out of this state may be reset. +.It Ic apm +It optional parameter +.Pq Fl l +specified, enables and sets advanced power management level, where +1 -- minimum power, 127 -- maximum performance with standby, +128 -- minimum power without standby, 254 -- maximum performance. +If not specified -- APM is disabled. +.It Ic aam +It optional parameter +.Pq Fl l +specified, enables and sets automatic acoustic management level, where +1 -- minimum noise, 254 -- maximum performance. +If not specified -- AAM is disabled. .It Ic security Update or report security settings, using an ATA identify command (0xec). By default, Modified: stable/10/sbin/camcontrol/camcontrol.c ============================================================================== --- stable/10/sbin/camcontrol/camcontrol.c Thu Mar 26 08:36:08 2015 (r280678) +++ stable/10/sbin/camcontrol/camcontrol.c Thu Mar 26 08:38:53 2015 (r280679) @@ -96,7 +96,9 @@ typedef enum { CAM_CMD_SECURITY = 0x0000001d, CAM_CMD_HPA = 0x0000001e, CAM_CMD_SANITIZE = 0x0000001f, - CAM_CMD_PERSIST = 0x00000020 + CAM_CMD_PERSIST = 0x00000020, + CAM_CMD_APM = 0x00000021, + CAM_CMD_AAM = 0x00000022 } cam_cmdmask; typedef enum { @@ -216,6 +218,8 @@ static struct camcontrol_opts option_tab {"idle", CAM_CMD_IDLE, CAM_ARG_NONE, "t:"}, {"standby", CAM_CMD_STANDBY, CAM_ARG_NONE, "t:"}, {"sleep", CAM_CMD_SLEEP, CAM_ARG_NONE, ""}, + {"apm", CAM_CMD_APM, CAM_ARG_NONE, "l:"}, + {"aam", CAM_CMD_AAM, CAM_ARG_NONE, "l:"}, {"fwdownload", CAM_CMD_DOWNLOAD_FW, CAM_ARG_NONE, "f:ys"}, {"security", CAM_CMD_SECURITY, CAM_ARG_NONE, "d:e:fh:k:l:qs:T:U:y"}, {"hpa", CAM_CMD_HPA, CAM_ARG_NONE, "Pflp:qs:U:y"}, @@ -1406,7 +1410,7 @@ atacapprint(struct ata_params *parm) parm->enabled.command2 & ATA_SUPPORT_APM ? "yes" : "no"); if (parm->support.command2 & ATA_SUPPORT_APM) { printf(" %d/0x%02X\n", - parm->apm_value, parm->apm_value); + parm->apm_value & 0xff, parm->apm_value & 0xff); } else printf("\n"); printf("automatic acoustic management %s %s", @@ -8001,6 +8005,68 @@ bailout: return (retval); } +static int +ataaxm(struct cam_device *device, int argc, char **argv, + char *combinedopt, int retry_count, int timeout) +{ + union ccb *ccb; + int retval = 0; + int l = -1; + int c; + u_char cmd, sc; + + ccb = cam_getccb(device); + + if (ccb == NULL) { + warnx("%s: error allocating ccb", __func__); + return (1); + } + + while ((c = getopt(argc, argv, combinedopt)) != -1) { + switch (c) { + case 'l': + l = atoi(optarg); + break; + default: + break; + } + } + sc = 0; + if (strcmp(argv[1], "apm") == 0) { + if (l == -1) + cmd = 0x85; + else { + cmd = 0x05; + sc = l; + } + } else /* aam */ { + if (l == -1) + cmd = 0xC2; + else { + cmd = 0x42; + sc = l; + } + } + + retval = ata_do_28bit_cmd(device, + ccb, + /*retries*/retry_count, + /*flags*/CAM_DIR_NONE, + /*protocol*/AP_PROTO_NON_DATA, + /*tag_action*/MSG_SIMPLE_Q_TAG, + /*command*/ATA_SETFEATURES, + /*features*/cmd, + /*lba*/0, + /*sector_count*/sc, + /*data_ptr*/NULL, + /*dxfer_len*/0, + /*timeout*/timeout ? timeout : 30 * 1000, + /*quiet*/1); + + cam_freeccb(ccb); + return (retval); +} + #endif /* MINIMALISTIC */ void @@ -8058,6 +8124,8 @@ usage(int printlong) " camcontrol idle [dev_id][generic args][-t time]\n" " camcontrol standby [dev_id][generic args][-t time]\n" " camcontrol sleep [dev_id][generic args]\n" +" camcontrol apm [dev_id][generic args][-l level]\n" +" camcontrol aam [dev_id][generic args][-l level]\n" " camcontrol fwdownload [dev_id][generic args] <-f fw_image> [-y][-s]\n" " camcontrol security [dev_id][generic args]\n" " <-d pwd | -e pwd | -f | -h pwd | -k pwd>\n" @@ -8578,6 +8646,11 @@ main(int argc, char **argv) error = atapm(cam_dev, argc, argv, combinedopt, retry_count, timeout); break; + case CAM_CMD_APM: + case CAM_CMD_AAM: + error = ataaxm(cam_dev, argc, argv, + combinedopt, retry_count, timeout); + break; case CAM_CMD_SECURITY: error = atasecurity(cam_dev, retry_count, timeout, argc, argv, combinedopt);