Date: Mon, 16 Jan 2006 22:10:06 GMT From: Gil Kloepfer <fgil@kloepfer.org> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/81692: [patch] atacontrol(8) support for disk APM and acoustic management Message-ID: <200601162210.k0GMA6SH037471@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/81692; it has been noted by GNATS. From: Gil Kloepfer <fgil@kloepfer.org> To: bug-followup@freebsd.org Cc: Subject: Re: bin/81692: [patch] atacontrol(8) support for disk APM and acoustic management Date: Mon, 16 Jan 2006 15:59:55 -0600 The following patch is an update to provide equivalent functionality for FreeBSD 6.0-RELEASE. It would be very helpful to have this in future FreeBSD releases. Thanks. -- Cut Here -- -- Cut Here -- -- Cut Here -- -- Cut Here -- --- sbin/atacontrol/atacontrol.c.ORIG Sun Aug 7 06:16:58 2005 +++ sbin/atacontrol/atacontrol.c Mon Jan 16 02:00:12 2006 @@ -108,6 +108,8 @@ " atacontrol rebuild array\n" " atacontrol status array\n" " atacontrol mode device [mode]\n" + " atacontrol feature device apm apmlevel\n" + " atacontrol feature device acoustic soundsupplevel\n" " atacontrol cap device\n" ); exit(EX_USAGE); @@ -319,6 +321,88 @@ err(1, "ioctl(IOCATAGMODE)"); printf("current mode = %s\n", mode2str(mode)); } + exit(EX_OK); + } + if (!strcmp(argv[1], "feature") && argc == 5) { + int disk; + char device[64]; + struct ata_ioc_request request; + + if (!(sscanf(argv[2], "ad%d", &disk) == 1 || + sscanf(argv[2], "acd%d", &disk) == 1 || + sscanf(argv[2], "afd%d", &disk) == 1 || + sscanf(argv[2], "ast%d", &disk) == 1)) { + fprintf(stderr, "atacontrol: Invalid device %s\n", + argv[2]); + exit(EX_USAGE); + } + sprintf(device, "/dev/%s", argv[2]); + if ((fd = open(device, O_RDONLY)) < 0) + err(1, "device not found"); + + bzero(&request, sizeof(struct ata_ioc_request)); + request.u.ata.command = ATA_SETFEATURES; + request.flags = ATA_CMD_CONTROL; + request.timeout = 500; + if (!strcmp(argv[3], "apm")) { + if (!strcmp(argv[4], "off")) { + request.u.ata.feature = ATA_SF_DIS_APM; + } + else if (!strcmp(argv[4], "maxperf")) { + request.u.ata.feature = ATA_SF_ENAB_APM; + request.u.ata.count = 0xfe; + } + else if (!strcmp(argv[4], "minpower")) { + request.u.ata.feature = ATA_SF_ENAB_APM; + request.u.ata.count = 0x01; + } + else { + int offset = 0; + + request.u.ata.feature = ATA_SF_ENAB_APM; + if (argv[4][0] == 's') { + offset = atoi(&argv[4][1]); + request.u.ata.count = 0x01; + } else { + offset = atoi(&argv[4][1]); + request.u.ata.count = 0x80; + } + if (offset >= 0 && offset <= 127) + request.u.ata.count += offset; + } + } + else if (!strcmp(argv[3], "acoustic")) { + if (!strcmp(argv[4], "off")) { + request.u.ata.feature = ATA_SF_DIS_ACCOUS; + } + else if (!strcmp(argv[4], "maxperf")) { + request.u.ata.feature = ATA_SF_ENAB_ACCOUS; + request.u.ata.count = 0xfe; + } + else if (!strcmp(argv[4], "maxquiet")) { + request.u.ata.feature = ATA_SF_ENAB_ACCOUS; + request.u.ata.count = 0x80; + } + else { + request.u.ata.feature = ATA_SF_ENAB_ACCOUS; + request.u.ata.count = atoi(argv[4]); + if (request.u.ata.count > 124) + request.u.ata.count = 124; + } + } + else + usage(); + + if (ioctl(fd, IOCATAREQUEST, &request) < 0) + err(1, "ioctl(IOCATAREQUEST)"); + + if (request.error != 0) { + fprintf(stderr, + "IOCATAREQUEST returned err status %d", + request.error); + exit(EX_IOERR); + } + exit(EX_OK); } if (!strcmp(argv[1], "cap") && argc == 3) { --- sbin/atacontrol/atacontrol.8.ORIG Fri Aug 19 10:54:42 2005 +++ sbin/atacontrol/atacontrol.8 Mon Jan 16 02:09:05 2006 @@ -64,6 +64,16 @@ .Ic mode .Ar device .Nm +.Ic feature +.Ar device +.Ic apm +.Ar apmlevel +.Nm +.Ic feature +.Ar device +.Ic acoustic +.Ar soundsupplevel +.Nm .Ic info .Ar channel .Nm @@ -187,6 +197,44 @@ (alias .Cm UDMA133 ) . The device name and manufacture/version strings are shown. +.It Ic feature / apm +Set disk drive Advanced Power Management (APM) level. +This command is generally used on laptop (notebook) hard disks to control +the power level consumed by the drive (at the expense of performance). +.Pp +The +.Ar apmlevel +may be set to one of: +.Cm off +(turn off APM), +.Cm maxperf +or +.Cm minpower +(optimize for maximum performance or minimum power, respectively), or +a numeric level which can be 0 to 127 inclusive indicating an increasing +level of performance over power savings. +The numeric levels may be prefixed by +.Cm s +which will allow the drive to include suspension as part of the +power savings. Note that not all hard drives will support the +.Cm off +command, and that the number of incremental power savings levels +do not typically have as wide of a range as this command will +support. +.It Ic feature / acoustic +Control disk drive Acoustic Management level. The +.Ar soundsupplevel +may be set to +.Cm off +which will turn off acoustic management, +.Cm maxperf +to optimize for maximum performance, +.Cm maxquiet +to optimize for maximum quiet, or a numeric level +from 0 to 124. The higher the numeric level, the higher the +theoretical sound level emitted from the drive. Note that few +devices support this command and even fewer will allow the +range of levels supported. .It Ic cap Show detailed info about the device on .Ar device . -- Cut Here -- -- Cut Here -- -- Cut Here -- -- Cut Here --
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601162210.k0GMA6SH037471>