Device-independent control of storage hardware using SCSI enclosure services

A SES API is disclosed as an interface between SES protocol code and non-SCSI storage enclosure hardware to abstract the SES protocol code from the control of the hardware. To control the hardware, SES commands are sent to the SES protocol code. The SES protocol code is responsive to the SES commands, but has no knowledge of the hardware. The SES protocol code converts the SES command to a series of function calls. When the SES API receives the function calls, it executes the corresponding functions. The SES API includes a customer-tailored interface library of functions. The library allows the end user to provide the hardware interface routines necessary for SES to control the hardware. The functions are written as templates, separate from the SES protocol code, so that end users can modify the functions to control the hardware without having to modify or understand the SES protocol code.

BACKGROUND OF THE INVENTION

1. Field of the Invention

The present invention relates, generally, to the configuration of hardware in storage enclosures, and in particular embodiments, to the abstracted control of storage enclosure hardware using the Small Computer System Interface (SCSI) Enclosure Services (SES) protocol.

2. Description of Related Art

FIG. 1illustrates an exemplary conventional system environment100. InFIG. 1, an initiator such as a host computer102, including an input/output (I/O) controller such as a Host Bus Adapter (HBA)104, is connected to a storage system106via an Ethernet or Local Area Network (LAN) or storage area network (SAN)108implementing a protocol such as Fibre Channel (FC). Storage system106includes one or more storage controllers such as Redundant Array of Independent Disks (RAID) controllers112, and mass storage capability such as a RAID110, which may include multiple storage enclosures referred to as SBODs (Switched Bunch Of Disks)114, each containing multiple disk drives132, a crossbar switch124, a processor126, and a variety of non-SCSI storage enclosure hardware128. The crossbar switch124provides ports for direct connections to each of the drives132within each SBOD114.

The RAID controllers112virtualize the SBODs114such that an initiator102on a front end116of a RAID controller112need not be concerned with how the RAID110is configured on a back end118of the RAID controller112. For example, the host102may send a command122to the front end116of a RAID controller112, such as a request to store data. The RAID controller112responds to this command122by initiating one or more write commands120on the back end118of the RAID controllers112according to a protocol such as a FC Arbitrated Loop (FCAL) protocol, wherein one command is required for each drive in one or more SBODs114that will store some of the requested data. Each command in the series of commands must pass serially through each crossbar switch124on each SBOD114, which are daisy-chained together using dedicated FC lines130, until the crossbar switch connected to the targeted drive is located.

FIG. 2illustrates another exemplary conventional system environment200. InFIG. 2, the initiator202, which includes an I/O controller such as a HBA204, is connected to a storage system206via an Ethernet or LAN or SAN208implementing a protocol such as FC. Storage system206includes one or more storage controllers such as RAID controllers212, a root switch234, and mass storage capability such as a RAID210, which may include multiple storage enclosures referred to as JBODs (Just a Bunch Of Disks)214, each containing multiple disk drives232connected in a loop. Root switch234includes a non-blocking crossbar switch224, a processor226, and a variety of non-SCSI storage enclosure hardware228. The crossbar switch224provides ports for direct connections to each of the JBODs214.

The RAID controllers212virtualize the JBODs214such that an initiator202on a front end216of a RAID controller212need not be concerned with how the RAID210is configured on a back end218of the RAID controller212. For example, the initiator202may send a command222to the front end216of a RAID controller212, such as a request to store data. The RAID controller212responds to this command222by initiating one or more write commands220on the back end218of the RAID controllers212according to a protocol such as FCAL, wherein one command is required for each drive in one or more JBODs114that will store some of the requested data. Dual FC lines230may be provided for each connection (e.g. channel A and B) for redundancy. Each command in the series of commands must pass through crossbar switch224in root switch234, which then makes the proper connection to route the commands directly the JBOD containing the targeted drive. The commands are then routed serially through each of the drives232in a loop in the JBOD214until the proper drive is located.

The various devices in the SBODs114ofFIG. 1or the root switch234ofFIG. 2need to be configured, including the non-SCSI storage enclosure hardware. In addition, these devices and hardware may store configuration information, statistics, and other information that may be of use to an end user of the storage system. Therefore, the SBODs114inFIG. 1and the root switch234inFIG. 2may include Ethernet ports (see reference character136inFIG. 1and reference character236inFIG. 2) and perhaps RS-232 serial ports (see reference character138inFIG. 1and reference character238inFIG. 2) to provide a management interface. However, in either case, an external connector and an external connection are required to configure the elements in the storage systems.

SCSI Enclosure Services (SES) is a protocol that has been developed to enable both SCSI and non-SCSI devices to be configured, monitored and controlled over a FC link. Essentially, SES comprises SCSI commands embedded in the FC protocol. The SES protocol is extensible and flexible to support the configuration and control of many different SCSI devices in an enclosure. Through the use of SES commands, an end user may operate a SES initiator such as a RAID controller or an HBA separate from the RAID controller to configure, monitor and control the devices within the SBODs114inFIG. 1or the root switch234inFIG. 2over the FC connections between the RAID controller and the SBODs or root switch.

FIG. 3illustrates an exemplary conventional storage system300that is configurable using SES commands. InFIG. 3, a Vitesse® VSC120 enclosure management controller302including a processor326is connected to drives332via port bypass circuits (PBCs)372in an SBOD implementation314. Non-SCSI hardware328may comprise a number of devices, including, but not limited to, one or more fans or cooling devices348, power supplies350, temperature sensors352, and lights, displays or indicators354.

To configure the hardware328, SES commands356are sent from a SES initiator such as a RAID controller312over the FC connection330directly to one of two FC ports382on the Vitesse® VSC120 enclosure management controller302. The FC ports382allow the VCS 120 to function as a SES device provided that the appropriate software is loaded. The SES commands356are SCSI commands embedded in the FC protocol, and configure, monitor and control the hardware328within the SBOD314. SES protocol code362executed by the processor326converts the SES commands356into signaling that may be sent over pre-defined hardware interface360for configuring, monitoring and controlling the non-SCSI hardware328. However, because the SES protocol code362requires special code to configure, monitor and control the non-SCSI hardware328, the SES protocol code362must be modified with specific knowledge of the actual non-SCSI hardware in the storage enclosure and an understanding of SES protocols. No pre-defined template for controlling non-SCSI hardware is provided, other than a very rudimentary set of functions that must be used when writing the special code to control the non-SCSI hardware. In addition, this Vitesse® VSC120 implementation allows no flexibility in the choice of processor, and does not allow for the defining of a new hardware interface if a previously unknown non-SCSI hardware device was inserted into the storage system.

Therefore, there is a need to abstract the SES protocol code from the control, monitoring and configuration of the non-SCSI storage enclosure hardware, to allow a choice of processor, and to enable the defining of new hardware interfaces.

SUMMARY OF THE INVENTION

The present invention is directed to abstracting the configuration, monitoring and control of non-SCSI storage enclosure hardware from SES protocol code. This is accomplished using a SES API as an interface between the SES protocol code and the non-SCSI storage enclosure hardware to abstract the SES protocol code from the configuration, monitoring and control of non-SCSI storage enclosure hardware.

A storage enclosure typically includes a non-blocking crossbar switch, devices such as disk drives, a processor, and non-SCSI storage enclosure hardware. The processor includes a switch API, which is source code and hardware drivers that allows the processor to make and receive function calls, control the crossbar switch, and generally communicate with the crossbar switch. The processor also includes a customer application for controlling the operation of the crossbar switch.

To configure, monitor and control the non-SCSI storage enclosure hardware, SES commands are sent from a SES initiator over a FC connection to the crossbar switch via a FC port. The SES commands are SCSI commands embedded in the FC protocol, and may be used to manage and sense the state of the non-SCSI storage enclosure hardware. The SES commands are then routed to an internal port on crossbar switch, which is connected to the switch API in the processor. The switch API then receives the SES commands from the crossbar switch, and forwards the SES commands to SES protocol code being executed by the processor.

In general, the SES protocol code enables the processor to appear as a SES device to the SES initiator. The SES protocol code understands the SCSI protocol and how to transport information across a FC link, and is responsive to the SES commands. In particular, the SES protocol code defines21devices with specific operational capabilities that can be controlled. There are also a group of end user defined devices that the end user can tailor to configure, monitor and control any type of hardware in the storage enclosure.

The SES protocol code has no knowledge of the specific non-SCSI storage enclosure hardware, and is therefore not capable of directly configuring, monitoring or controlling the non-SCSI storage enclosure hardware. However, this specific knowledge is not necessary. To perform the operation specified by a SES command, the SES protocol code converts the SES command to a series of C function calls. This set of C function calls make up the SES API. When the SES API C function is called from the SES protocol code, it executes the corresponding functions, which have been tailored for the specific hardware in the storage enclosure. For example, the functions may request certain data from a specific piece of non-SCSI storage enclosure hardware. When the data is returned by the C function, the data is passed back to the SES protocol code, which then prepares SES commands containing the data. These SES commands are sent back to the SES initiator via the switch API and the crossbar switch.

The SES API is a customer-tailored interface library of C functions. This library allows the end user to specify to the SES protocol code what non-SCSI hardware devices are supported and what state they are in (e.g. alerts, values, existence). The library also allows the end user to provide the hardware interface routines necessary for SES to control their implementation in the storage enclosure. The functions in the SES API are written as templates or starting points, separate from the SES protocol code, so that end users can modify the functions in the SES API to communicate with and control the particular non-SCSI storage enclosure hardware in the hardware enclosure, without having to modify or even understand the SES protocol code. In addition to a set of defined function calls, there is a group of get and set vendor-defined functions that can be modified for use with any type of hardware. When data is returned from one of these functions, the SES protocol code does not know what the data represents, but it sends it back anyway.

One of the advantages of this invention (the user-configurable SES API) is its upgradeability. Once the end user has invested the time to modify the template and generate functions specific to particular hardware, the processor and crossbar switch may be upgraded, and yet the same tailored SES API can be used with those upgraded devices to configure, monitor and control the same storage enclosure hardware. Another advantage is that the SES protocol code further allows an end user to verify that the SES initiator “sees” the processor as a SES device. Once the storage enclosure is connected to the SES initiator, an end user can verify that the processor appears as a SES device to the SES initiator. This step enables the end user to verify that a functioning SES device exists, and that the FC link to that device is also operational. Thereafter, functionality can be added to the SES API to enable it to control and configure the non-SCSI storage enclosure hardware, confident that the SES protocol code is operational. Yet another advantage is that because the processor relies on the crossbar switch to provide a connection to the FC link, the processor need not have FC ports, and it can be substantially less expensive than other processors previously used. In addition, because the control of the non-SCSI storage enclosure hardware is implemented in firmware, a processor may be chosen for the hardware enclosure that fits the particular application.

DETAILED DESCRIPTION OF PREFERRED EMBODIMENTS

Embodiments of the present invention are directed to abstracting the configuration, monitoring and control of non-SCSI storage enclosure hardware from SES protocol code. This is accomplished using a SES API as an interface between the SES protocol code and the non-SCSI storage enclosure hardware.

FIG. 4illustrates an exemplary storage system400including a crossbar switch424and a processor434selected for controlling the crossbar switch424and for implementing a SES API468to abstract SES protocol code478from the configuration, monitoring and control of non-SCSI storage enclosure hardware428according to embodiments of the present invention. Non-SCSI storage enclosure hardware428may comprise a number of devices, including, but not limited to, one or more fans or cooling devices448, power supplies450, temperature sensors452, and lights, displays or indicators454. Note thatFIG. 4is generalized, wherein storage enclosure480is intended to represent the crossbar switch424in either a root switch implementation484(see drives432configured as a JBOD414) or an SBOD implementation470(see drives432configured as an SBOD472).

Processor434includes a switch API444, which is source code and hardware drivers that allows the processor434to make and receive function calls, control the crossbar switch424, and generally communicate with the crossbar switch424. Processor434also includes a customer application446for controlling the operation of the crossbar switch424and the root switch484or SBOD470.

To configure, monitor and control the non-SCSI storage enclosure hardware428, SES commands456are sent from a RAID controller412over a FC connection430to the crossbar switch424via a FC port482. The SES commands456are SCSI commands embedded in the FC protocol, and may be used to manage and sense the state of the non-SCSI storage enclosure hardware428. The SES commands456are then routed to internal port458on crossbar switch424. Note that when the SES protocol code comes on-line it negotiates for an address on the loop. This address is referred to as an AL_PA. The internal port458in the switch is configured to recognize and respond to this AL_PA so when a frame is sent by the SES initiator to the SES device, the internal port458sees its AL_PA and grabs the frame. Thus, internal port458is directly connectable to the FC port482, just like any other external port in the crossbar switch424.

The connection between the internal port458and the processor434may be a serial bus460internal to the enclosure that provides a communication link between integrated circuits, such as the Inter-Integrated Circuit (I2C) protocol, or it may be a parallel connection. Note that previous systems did not contain an internal port458, making it impossible to access the processor434through the FC link430, and making it impossible to respond to SES commands in the processor434. The switch API444then receives the SES commands456from the crossbar switch424, and forwards the SES commands456to SES protocol code478.

In general, the SES protocol code478enables the processor434to appear as a SES device to the RAID controller412. For a SCSI device to appear on a FC loop, it needs to understand and process certain SCSI level protocol operations. For example, a HBA may send a “test unit ready” command to a SCSI device, and the SCSI device must be able to return either a yes or no. The SES protocol code478understands the SCSI protocol and how to transport information across a FC link, and is responsive to the SES commands456. In particular, the SES protocol code478defines 21 devices with specific operational capabilities that can be controlled, such as temperature sensors, cooling elements, power supplies, door locks, uninterruptible power supplies, keypads, displays, and the like. For example, a temperature sensor may provide a storage enclosure temperature, a power supply may provide an undervoltage or overvoltage indication, and a door lock can be commanded to lock or unlock. There are also a group of end user defined devices that the end user can tailor to configure, monitor and control any type of hardware in the storage enclosure. Note that there is no link between the customer application446and the SES protocol code478, and therefore there is no control of the SES protocol code478from the customer application446.

The SES protocol code478has no knowledge of the specific non-SCSI storage enclosure hardware428, and is therefore not capable of directly configuring, monitoring or controlling the non-SCSI storage enclosure hardware428. However, this specific knowledge is not necessary. To perform the operation specified by a SES command456, the SES protocol code converts the SES command456to a series of C function calls, such as “get temperature,” or “get speed of fan,” or the like. These C function calls make up the SES API468. For example, if a SES command456seeks to read the temperature within the storage enclosure480, the SES protocol code478issues a series of SES API478C function calls.

The SES API468includes a customer-tailored interface library of C functions. This library allows the end user to specify to the SES protocol code478what non-SCSI hardware devices428are supported and what state they are in (e.g. alerts, values, existence). The library also allows the end user to provide the hardware interface routines necessary for SES to control their implementation in the storage enclosure480. In addition to interfacing to hardware, the SES API468allows an end user to create vendor-defined mode, inquiry, and diagnostic pages as well as fill vendor-defined fields on other pages. Note that there are certain commands in SCSI that allow an initiator to read back information from the target. One of these is the MODE SENSE command. The information that can be returned by the MODE SENSE command is separated into logical groups of related data named pages. The initiator specifies which page of data it wishes to have returned. The INQUIRY command and the READ DIAGNOSTICS RESULTS command also support this. Pages are logical groupings of data.

In general, the SES API468may include functions to (1) query the existence of an enclosure element, (2) query the status of an enclosure element, (3) control an enclosure element, (4) query the existence of a sub-enclosure, and (5) query and control elements in a sub-enclosure. To support additional vendor-defined mode pages, the SES API468may include functions to (5) query the existence of vendor-defined mode pages, (6) read vendor-defined mode pages, (7) write vendor-defined mode pages, and (8) fill in various vendor-defined fields in standard mode pages. To support additional vendor-defined diagnostics pages, the SES API468may include functions to (9) query the existence of vendor-defined diagnostics pages, (10) read vendor-defined mode pages, and (11) write vendor-defined mode pages. To support additional vendor-defined inquiry pages, the SES API468may include functions to (12) query the existence of vendor-defined Inquiry pages, and (13) read vendor-defined Inquiry pages.

When the SES API478C functions are called from the SES protocol code478, it executes the corresponding functions, which have been tailored for the specific hardware in the storage enclosure480. For example, the functions may request temperature data from a specific temperature sensor452in the storage enclosure480. When the temperature data is returned to the function, the data is passed back to the SES protocol code478, which then prepares SES commands containing the temperature reading. These SES commands are sent back to the RAID controller412via the switch API444and crossbar switch424.

The functions in the SES API468are written as templates or starting points, separate from the SES protocol code478, so that end users can modify the functions in the SES API468to communicate with and control the particular non-SCSI storage enclosure hardware428in the hardware enclosure480, without having to modify or even understand the SES protocol code478. As noted above, previous systems integrated the SES API functionality within the SES protocol code, making it extremely difficult for end users to modify the SES protocol code in accordance with the particular non-SCSI storage enclosure hardware in the hardware enclosure.

However, embodiments of the present invention separate the SES API468from the SES protocol code478, so that end users need not understand the SES protocol. The SES protocol code478is FC and SES protocol specific, and defines the format of each frame and field and record that comes across the FC link. On the other hand, the non-SCSI storage enclosure hardware428may not conform to any protocol, yet may require a particular format for enabling communications with that hardware428via hardware commands464. By separating the SES API468from the SES protocol code478, the SES protocol code478need not know the particular format for the hardware428, and the hardware428need not understand the SES protocol code478.

For example, suppose there is a 4-byte representation of a temperature level that has been requested in a SES command456. When the SES protocol code478receives the SES command456, it issues a series of SES API468function calls, requesting the temperature level from a temperature sensor. The C function calls474, which have been previously tailored by the end user for the specific temperature sensor452employed in the storage enclosure480, will retrieve the temperature level from the temperature sensor452and return a 32-bit entity referred to as an “unsigned long” that indicates the temperature level to the SES protocol code478. The SES protocol code478takes this unsigned long and puts it back in the record in the proper location. It should be understood that the end user does not have to know this format. The end user only needs to be able to modify the functions in the SES API468in accordance with the specific non-SCSI storage enclosure hardware428.

The SES API468supports everything that the SES protocol code478can control, and the SES protocol code478is very flexible. In addition to a set of defined function calls, there is a group of get and set vendor-defined functions that can be modified for use with any type of hardware. When data is returned from one of these functions, the SES protocol code478does not know what the data represents, but it sends it back anyway. An exemplary set of C function calls is provided in Table I below.

TABLE ISES API FUNCTIONSFunction nameDescriptionsapi_initializeElementClassesThis function will be called during initialization. Thepurpose of this function is to allow the Vendor theopportunity to register all of the element classes with theSES code.sapi_modePageExistsThis function is called to determine if a particular mode pageexists (i.e., supported).sapi_readVendorSpecificMode pages 0x00 and 0x20-0x3E are vendor specific. ThisModePagefunction is called to read one of these mode pages.sapi_writeVendorSpecificMode pages 0x00 and 0x20-0x3E are vendor specific. ThisModePagefunction is called to write one of these mode pages.sapi_inquiryPageExistsThis function is called to determine if a particular inquirypage exists (i.e., supported).sapi_readVendorSpecificInquiry pages 0xC0-0xFF are vendor specific. ThisInquiryPagefunction is called to read one of these inquiry pagessapi_getSESDeviceInfoThis function is used to gather information about the SESDevice for the Standard Inquiry Data Page.sapi_readStdInquiryDataVendorThis function is called to fill in the second Vendor SpecificSpecificField2field in the Standard Inquiry Data Page (starting at byte 96 ofthe Standard Inquiry page).sapi_getFRUInformationThis function is used to gather information for the ASCIIInformation page, INQUIRY pages 0x01-0x7f. The ASCIIinformation page contains information for the fieldreplaceable unit code returned in the REQUEST SENSEdata.sapi_getProductSerialNumberThis function is used to gather information for the UnitSerial Number page, INQUIRY page 0x80. This should bethe serial number of the SES Device and not the enclosure'sserial number.sapi_getOperatingDefinitionThis function is used to gather the ASCII ImplementedDescriptionOperating Definition data used to fill in the Inquiry page0x82.sapi_getOperatingVendorThis function is used to gather the Vendor SpecificSpecificDescriptionInformation used to fill in the Inquiry page 0x82.sapi_getDeviceIDThis function is used to gather information for the DeviceIdentification page, INQUIRY page 0x83. The deviceidentification page provides the means to retrieve zero ormore identification descriptors applying to the logical unit.sapi_runSelfTestThis function is called when the SelfTest bit is set to one inthe Send Diagnostic command. Perform the target's defaultself test.sapi_diagnosticPageExistsThis function is called to determine if a particular diagnosticpage exists (i.e. supported).sapi_getEnclosurelnfoThis function is used to gather information about the sub-enclosures for the Configuration page. Diagnostic page0x01.sapi_getTypeDescriptorTextThis function is used to gather information about the elementclasses for the Configuration page. Diagnostic page 0x01.sapi_getHelpTextThe enclosure services help text page contains a string ofcharacters from the enclosure that describes the present stateof the enclosure and provides text indicating what correctiveactions, if any, are desirable to bring the enclosure to its fullyoperational state.sapi_stringOutThe enclosure services string out page transmits an enclosuredependent binary string from the application client to theenclosure services process.sapi_stringInThe enclosure services string in page transmits an enclosuredependent binary string from the enclosure services processto the application client.sapi_setThresholdsThe threshold out page is transmitted to the enclosureservices process to establish threshold values for thoseelements that have limit sensing capability, for examplevoltage sensors, current sensors, and temperature sensors.This function is used to set the threshold for a particularelement class.sapi_getThresholdsThe threshold in page is transmitted from the enclosureservices process to the application client to report the actualthreshold values for those elements that have limit sensingcapability, for example voltage sensors, current sensors, andtemperature sensors.sapi_getElementDescriptorTextThis function is called to fill in the Element Descriptor Page(Page 0x07).sapi_getShortStatusThis function is called to fill in the enclosure Status of theShort Enclosure Status Page (Page 0x08).sapi_readVendorSpecificDiagnostic pages 0x80-0xFF are vendor specific. ThisDiagPagefunction is called to read one of these diagnostic pages.sapi_writeVendorSpecificDiagnostic pages 0x80-0xFF are vendor specific. ThisDiagPagefunction is called to write one of these diagnostic pages.sapi_setUnspecifiedThis function gets the status of the control variables for theElementControl“Unspecified” Element specified by the elementClassID,subEnclosureID and elementNumber.sapi_getUnspecifiedThis function sets the control variables for the “Unspecified”ElementStatusElement specified by the elementClassID, subEnclosureIDand elementNumber.sapi_setDeviceElementControlThis function sets the control variables for the “Device”Element specified by the elementClassID, subEnclosureIDand elementNumber.sapi_getDeviceElementStatusThis function gets the status of control variables for the“Device” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setDeviceElementThis function sets the control variables for the “Device”ArrayControlElement Array specified by the elementClassID,subEnclosureID and elementNumber.sapi_getDeviceElementThis function gets the status of control variables for theArrayStatus“Device” Element Array specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setPowerSupplyThis function gets the status of the control variables for theElementControl“Power Supply” Element specified by the elementClassID,subEnclosureID and elementNumber.sapi_getPowerSupplyThis function sets the control variables for the “PowerElementStatusSupply” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setCoolingThis function gets the status of the control variables for theElementControl“Cooling” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getCoolingElementStatusThis function sets the control variables for the “Cooling”Element specified by the elementClassID, subEnclosureID,and elementNumber.sapi_setTemperatureThis function gets the status of the control variables for theElementControl“Temperature” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getTemperatureThis function sets the control variables for theElementStatus“Temperature” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setDoorlockElementControlThis function gets the status of the control variables for the“Doorlock” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getDoorlockElementStatusThis function sets the control variables for the “Doorlock”Element specified by the elementClassID, subEnclosureID,and elementNumber.sapi_setAudibleAlarmThis function gets the status of the control variables for theElementControl“Audible Alarm” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getAudibleAlarmThis function sets the control variables for the “AudibleElementStatusAlarm” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setESControllerThis function gets the status of the control variables for theElementControl“Enclosure Services Controller” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getESControllerThis function sets the control variables for the “EnclosureElementStatusServices Controller” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_setSCCControllerThis function gets the status of the control variables for theElementControl“ECC Controller” Element specified by the elementClassID,subEnclosureID and elementNumber.sapi_getSCCControllerThis function sets the control variables for the “SCCElementStatusController” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setNVCacheElementControlThis function gets the status of the control variables for the“Nonvolatile Cache” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getNVCacheElementStatusThis function sets the control variables for the “NonvolatileCache” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setUninterruptiblePSThis function gets the status of the control variables for theElementControl“Uninterruptible Power Supply” Element specified by theelementClassID, subEnclosureID, and elementNumber.sapi_getUninterruptiblePSThis function sets the control variables for theElementStatus“Uninterruptible Power Supply” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_setDisplayElementControlThis function gets the status of the control variables for the“Display” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getDisplayElementStatusThis function sets the control variables for the “Display”Element specified by the elementClassID, subEnclosureID,and elementNumber.sapi_setKeypadElementControlThis function gets the status of the control variables for the“Keypad” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getKeypadElementStatusThis function sets the control variables for the “Keypad”Element specified by the elementClassID, subEnclosureID,and elementNumber.sapi_setPortTransElementControlThis function gets the status of the control variables for the“SCSI Port/Transceiver” Element specified by theelementClassID, subEnclosureID, and elementNumber.sapi_getPortTransElementStatusThis function sets the control variables for the “SCSIPort/Transceiver” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setLanguageElementControlThis function gets the status of the control variables for the“Language” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_getLanguageElementStatusThis function sets the control variables for the “Language”Element specified by the elementClassID, subEnclosureID,and elementNumber.sapi_setCommunicationPortThis function gets the status of the control variables for theElementControl“Communication Port” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getCommunicationPortThis function sets the control variables for theElementStatus“Communication Port” Element specified by theelementClassID, subEnclosureID, and elementNumber.sapi_setVoltageSensorThis function gets the status of the control variables for theElementControl“Voltage Sensor” Element specified by the elementClassID,subEnclosureID and elementNumber.sapi_getVoltageSensorThis function sets the control variables for the “VoltageElementStatusSensor” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setCurrentSensorThis function gets the status of the control variables for theElementControl“Current Sensor” Element specified by the elementClassID,subEnclosureID and elementNumber.sapi_getCurrentSensorThis function sets the control variables for the “CurrentElementStatusSensor” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setTargetPortThis function gets the status of the control variables for theElementControl“SCSI Target Port” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getTargetPortThis function sets the control variables for the “SCSI TargetElementStatusPort” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setInitiatorPortThis function gets the status of the control variables for theElementControl“SCSI Initiator Port” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getInitiatorPortThis function sets the control variables for the “InitiatorElementStatusPort” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setSimpleSubEnclosureThis function gets the status of the control variables for theElementControl“Simple Sub-Enclosure” Element specified by theelementClassID, subEnclosureID and elementNumber.sapi_getSimpleSubEnclosureThis function sets the control variables for the “Simple Sub-ElementStatusEnclosure” Element specified by the elementClassID,subEnclosureID, and elementNumber.sapi_setVendorSpecificThis function gets the status of the control variables for theElementControl“Vendor Specific” Element specified by the elementClassID,subEnclosureID, elementNumber, and elementType.sapi_getVendorSpecificThis function sets the control variables for the “VendorElementStatusSpecific” Element specified by the elementClassID,subEnclosureID, elementNumber, and elementType.sapi_vendorlmplementedThis function is called for all SCSI commands received thatScsiCmdare not implemented by the SES code. This allows thevendor to implement additional SCSI commands if desired.

One of the advantages of this invention (the user-configurable SES API) is its upgradeability. Once the end user has invested the time to modify the template and generate functions specific to particular hardware, the processor and crossbar switch may be upgraded, and yet the same tailored SES API can be used with those upgraded devices to configure, monitor and control the same storage enclosure hardware.

Another advantage is that the SES protocol code478further allows an end user to verify that the RAID controller412“sees” the processor434as a SES device. Once the storage enclosure480is connected to the RAID controller412, an end user can verify that the processor434appears as a SES device to the RAID controller412. This step enables the end user to verify that a functioning SES device exists, and that the FC link to that device is also operational. Thereafter, functionality can be added to the SES API468to enable it to control and configure the non-SCSI storage enclosure hardware428, confident that the SES protocol code478is operational.

Yet another advantage is that because the processor434relies on the crossbar switch424to provide a connection to the FC link, the processor434need not have FC ports, and it can be substantially less expensive than other processors previously used such as the Vitesse® VSC120. In addition, because the control of the non-SCSI storage enclosure hardware428is implemented in firmware, a processor may be chosen for the hardware enclosure480that fits the particular application.