From owner-freebsd-bugs@FreeBSD.ORG Mon Jan 16 22:10:28 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CA37216A4D6 for ; Mon, 16 Jan 2006 22:10:27 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 72FE643D49 for ; Mon, 16 Jan 2006 22:10:08 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k0GMA6FF037472 for ; Mon, 16 Jan 2006 22:10:06 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k0GMA6SH037471; Mon, 16 Jan 2006 22:10:06 GMT (envelope-from gnats) Date: Mon, 16 Jan 2006 22:10:06 GMT Message-Id: <200601162210.k0GMA6SH037471@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Gil Kloepfer Cc: Subject: Re: bin/81692: [patch] atacontrol(8) support for disk APM and acoustic management X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Gil Kloepfer List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jan 2006 22:10:28 -0000 The following reply was made to PR bin/81692; it has been noted by GNATS. From: Gil Kloepfer 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 --