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);
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to