#
#  Intel(R) Enclosure LED Utilities
#  Copyright (C) 2009-2013 Intel Corporation.
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms and conditions of the GNU General Public License,
#  version 2, as published by the Free Software Foundation.
#
#  This program is distributed in the hope it will be useful, but WITHOUT
#  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
#  more details.
#
#  You should have received a copy of the GNU General Public License along with
#  this program; if not, write to the Free Software Foundation, Inc., 
#  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
#
=head1 NAME

ledctl - Intel(R) LED control application for a storage enclosures.

=head1 SYNOPSIS

B<ledctl> [I<OPTIONS>] I<pattern_name>=I<list_of_devices> ...

=head1 DESCRIPTION

The ledctl is an user space application designed to control LEDs associated with each
slot in an enclosure or a drive bay. The LEDs of devices listed in I<list_of_devices>
are set to the given pattern I<pattern_name> and all other LEDs are turned off.
User must have root privileges to use this application.

There are two types of systems: 2-LEDs systems (Activity LED, Status LED)
and 3-LEDs systems (Activity LED, Locate LED, Fail LED).
The ledctl application uses SGPIO and SES-2 protocol to control LEDs.
The program implements IBPI patterns of SFF-8489 specification for SGPIO.
Please note some enclosures do not stick close to SFF-8489 specification.
It might happen that enclosure's processor will accept an IBPI pattern but it will
blink the LEDs at variance with SFF-8489 specification or it has limited number
of patterns supported.

LED management (AHCI) and S<SAF-TE> protocols are not supported.

The ledctl application has been verified to work with Intel(R) storage
controllers (i.e. Intel(R) AHCI controller and Intel(R) SAS controller).
The application might work with storage controllers of other vendors
(especially SCSI/SAS controllers). However, storage controllers of other
vendors have not been tested.

The ledmon application has the highest priority when accessing LEDs.
It means that some patterns set by ledctl may have no effect if ledmon is running
(except Locate pattern).

The ledctl application is a part of Intel(R) Enclosure LED Utilities.

=head2 Pattern Names

The ledctl application accepts the following names for I<pattern_name> argument
according to SFF-8489 specification.

=over 8

=item B<locate>

Turns Locate LED associated with the given device(s) or empty slot(s) on.

=item B<locate_off>

Turns only Locate LED off.

=item B<normal>

Turns Status LED, Failure LED and Locate LED off.

=item B<off>

Turns only Status LED and Failure LED off.

=item B<ica> or B<degraded>

Visualizes "In a Critical Array" pattern.

=item B<rebuild> or B<rebuild_p>

Visualizes "Rebuild" pattern.

=item B<ifa> or B<failed_array>

Visualizes "In a Failed Array" pattern.

=item B<hotspare>

Visualizes "Hotspare" pattern.

=item B<pfa>

Visualizes "Predicted Failure Analysis" pattern.

=item B<failure> or B<disk_failed>

Visualizes "Failure" pattern.

=item B<ses_abort>

SES-2 R/R ABORD

=item B<ses_rebuild>

SES-2 REBUILD/REMAP

=item B<ses_ifa>

SES-2 IN FAILED ARRAY

=item B<ses_ica>

SES-2 IN CRIT ARRAY

=item B<ses_cons_check>

SES-2 CONS CHECK

=item B<ses_hotspare>

SES-2 HOT SPARE

=item B<ses_rsvd_dev>

SES-2 RSVD DEVICE

=item B<ses_ok>

SES-2 OK

=item B<ses_ident>

SES-2 IDENT

=item B<ses_rm>

SES-2 REMOVE

=item B<ses_insert>

SES-2 INSERT

=item B<ses_missing>

SES-2 MISSING

=item B<ses_dnr>

SES-2 DO NOT REMOVE

=item B<ses_active>

SES-2 ACTIVE

=item B<ses_enbale_bb>

SES-2 ENABLE BYP B

=item B<ses_enable_ba>

SES-2 ENABLE BYP A

=item B<ses_devoff>

SES-2 DEVICE OFF

=item B<ses_fault>

SES-2 FAULT

=back

=head2 Patterns Translation

When non SES-2 pattern is send to device in enclosure automatic
translation is being done.

=over 8

=item B<locate>

I<locate> is translated to I<ses_ident> 

=item B<locate_off>

I<locate_off> is translated to I<~ses_ident>

=item B<normal>

I<normal> is translated to I<ses_ok>

=item B<off>

I<off> is translated to I<ses_ok>

=item B<degraded>

I<degraded> is translated to I<ses_ica>

=item B<rebuild>

I<rebuild> is translated to I<ses_rebuild>

=item B<rebuild_p>

I<rebuild_p> is translated to I<ses_rebuild>

=item B<failed>

I<failed> is translated to I<ses_ifa>

=item B<hotspare>

I<hotspare> is translated to I<ses_hotspare>

=item B<pfa>

I<pfa> is translated to I<ses_rsvd_dev>

=item B<failure>

I<failure> is translated to I<ses_fault>

=item B<disk_failed>

I<disk_failed> is translated to I<ses_fault>

=back

=head2 List of Devices

The application accepts a list of devices in two formats. The first
format is a list with comma separated elements. The second format is S<a
list> in curly braces and elements are separated by space. See examples
section bellow for details.

A device is a path to file in /dev directory or in /sys/block directory.
It may identify a block device, a RAID device or a container device.
In case of a RAID device or a container device a state will be set for all
block devices associated, respectively.

The LEDs of devices listed in I<list_of_devices> are set to the given
pattern I<pattern_name> and all other LEDs are turned off.

=head1 OPTIONS

=over 8

=item B<-c> or B<--config>=I<path>

Sets a path to local configuration file. If this option is specified the
global configuration file and user configuration file has no effect.

=item B<-l> or B<--log>=I<path>

Sets a path to local log file. If this option is specified the global log
file F</var/log/ledctl.log> is not used.

=item B<-h> or B<--help>

Prints this text out and exits.

=item B<-v> or B<--version>

Displays version of ledctl and information about the license and exits.

=back

=head1 FILES

=over 8

=item F</var/log/ledctl.log>

Global log file, used by all instances of ledctl application. To force logging
to user defined file use I<-l> option switch.

=item F<~/.ledctl>

User configuration file, shared between ledmon and all ledctl application
instances.

=item F</etc/ledcfg.conf>

Global configuration file, shared between ledmon and all ledctl application
instances.

=back

=head1 EXAMPLES

The following example illustrates how to locate a single block device.

    ledctl locate=/dev/sda

The following example illustrates how to turn Locate LED off for the same block device.

    ledctl locate_off=/dev/sda

The following example illustrates how to locate disks of a RAID device and
how to set rebuild pattern for two block devices at the same time. This example
uses both formats of device list.

     ledctl locate=/dev/md127 rebuild={ /sys/block/sd[a-b] }

The following example illustrates how to turn Status LED and Failure LED off for
the given device(s).

     ledctl off={ /dev/sda /dev/sdb }

The following example illustrates how to locate a three block devices. This
example uses the first format of device list.

     ledctl locate=/dev/sda,/dev/sdb,/dev/sdc

=head1 LICENSE

Copyright (c) 2009-2013 Intel Corporation.

This program is distributed under the terms of the GNU General Public License
as published by the Free Software Foundation. See the built-in help for
details on the License and the lack of warranty.

=head1 SEE ALSO

ledmon(8), ledctl.conf(5)

=head1 AUTHOR

This manual page was written by Artur Wojcik <artur.wojcik@intel.com>. It may
be used by others.
