f11c7f6305
The isci driver is for the integrated SAS controller in the Intel C600 (Patsburg) chipset. Source files in sys/dev/isci directory are FreeBSD-specific, and sys/dev/isci/scil subdirectory contains an OS-agnostic library (SCIL) published by Intel to control the SAS controller. This library is used primarily as-is in this driver, with some post-processing to better integrate into the kernel build environment. isci.4 and a README in the sys/dev/isci directory contain a few additional details. This driver is only built for amd64 and i386 targets. Sponsored by: Intel Reviewed by: scottl Approved by: scottl
463 lines
15 KiB
C
463 lines
15 KiB
C
/*-
|
|
* This file is provided under a dual BSD/GPLv2 license. When using or
|
|
* redistributing this file, you may do so under either license.
|
|
*
|
|
* GPL LICENSE SUMMARY
|
|
*
|
|
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that 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.
|
|
* The full GNU General Public License is included in this distribution
|
|
* in the file called LICENSE.GPL.
|
|
*
|
|
* BSD LICENSE
|
|
*
|
|
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
#ifndef _SCIC_PHY_H_
|
|
#define _SCIC_PHY_H_
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* @brief This file contains all of the interface methods that can be called
|
|
* by an SCIC user on a phy (SAS or SATA) object.
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
#include <dev/isci/scil/sci_types.h>
|
|
#include <dev/isci/scil/sci_status.h>
|
|
|
|
#include <dev/isci/scil/intel_sata.h>
|
|
#include <dev/isci/scil/intel_sas.h>
|
|
|
|
|
|
/**
|
|
* @struct SCIC_PHY_PROPERTIES
|
|
* @brief This structure defines the properties common to all phys
|
|
* that can be retrieved.
|
|
*/
|
|
typedef struct SCIC_PHY_PROPERTIES
|
|
{
|
|
/**
|
|
* This field specifies the port that currently contains the
|
|
* supplied phy. This field may be set to SCI_INVALID_HANDLE
|
|
* if the phy is not currently contained in a port.
|
|
*/
|
|
SCI_PORT_HANDLE_T owning_port;
|
|
|
|
/**
|
|
* This field specifies the maximum link rate for which this phy
|
|
* will negotiate.
|
|
*/
|
|
SCI_SAS_LINK_RATE max_link_rate;
|
|
|
|
/**
|
|
* This field specifies the link rate at which the phy is
|
|
* currently operating.
|
|
*/
|
|
SCI_SAS_LINK_RATE negotiated_link_rate;
|
|
|
|
/**
|
|
* This field indicates the identify address frame that will be
|
|
* transmitted to the connected phy.
|
|
*/
|
|
SCI_SAS_IDENTIFY_ADDRESS_FRAME_T transmit_iaf;
|
|
|
|
/**
|
|
* This field specifies the index of the phy in relation to other
|
|
* phys within the controller. This index is zero relative.
|
|
*/
|
|
U8 index;
|
|
|
|
} SCIC_PHY_PROPERTIES_T;
|
|
|
|
/**
|
|
* @struct SCIC_SAS_PHY_PROPERTIES
|
|
* @brief This structure defines the properties, specific to a
|
|
* SAS phy, that can be retrieved.
|
|
*/
|
|
typedef struct SCIC_SAS_PHY_PROPERTIES
|
|
{
|
|
/**
|
|
* This field delineates the Identify Address Frame received
|
|
* from the remote end point.
|
|
*/
|
|
SCI_SAS_IDENTIFY_ADDRESS_FRAME_T received_iaf;
|
|
|
|
/**
|
|
* This field delineates the Phy capabilities structure received
|
|
* from the remote end point.
|
|
*/
|
|
SAS_CAPABILITIES_T received_capabilities;
|
|
|
|
} SCIC_SAS_PHY_PROPERTIES_T;
|
|
|
|
/**
|
|
* @struct SCIC_SATA_PHY_PROPERTIES
|
|
* @brief This structure defines the properties, specific to a
|
|
* SATA phy, that can be retrieved.
|
|
*/
|
|
typedef struct SCIC_SATA_PHY_PROPERTIES
|
|
{
|
|
/**
|
|
* This field delineates the signature FIS received from the
|
|
* attached target.
|
|
*/
|
|
SATA_FIS_REG_D2H_T signature_fis;
|
|
|
|
/**
|
|
* This field specifies to the user if a port selector is connected
|
|
* on the specified phy.
|
|
*/
|
|
BOOL is_port_selector_present;
|
|
|
|
} SCIC_SATA_PHY_PROPERTIES_T;
|
|
|
|
/**
|
|
* @enum SCIC_PHY_COUNTER_ID
|
|
* @brief This enumeration depicts the various pieces of optional
|
|
* information that can be retrieved for a specific phy.
|
|
*/
|
|
typedef enum SCIC_PHY_COUNTER_ID
|
|
{
|
|
/**
|
|
* This PHY information field tracks the number of frames received.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_FRAME,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of frames transmitted.
|
|
*/
|
|
SCIC_PHY_COUNTER_TRANSMITTED_FRAME,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DWORDs received.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_FRAME_DWORD,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DWORDs transmitted.
|
|
*/
|
|
SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of times DWORD
|
|
* synchronization was lost.
|
|
*/
|
|
SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of received DWORDs with
|
|
* running disparity errors.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of received frames with a
|
|
* CRC error (not including short or truncated frames).
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
|
|
* primitives received.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
|
|
* primitives transmitted.
|
|
*/
|
|
SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of times the inactivity
|
|
* timer for connections on the phy has been utilized.
|
|
*/
|
|
SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
|
|
* primitives received.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
|
|
* primitives transmitted.
|
|
*/
|
|
SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT,
|
|
|
|
/**
|
|
* This PHY information field tracks the number of CREDIT BLOCKED
|
|
* primitives received.
|
|
* @note Depending on remote device implementation, credit blocks
|
|
* may occur regularly.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED,
|
|
|
|
/**
|
|
* This PHY information field contains the number of short frames
|
|
* received. A short frame is simply a frame smaller then what is
|
|
* allowed by either the SAS or SATA specification.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME,
|
|
|
|
/**
|
|
* This PHY information field contains the number of frames received after
|
|
* credit has been exhausted.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT,
|
|
|
|
/**
|
|
* This PHY information field contains the number of frames received after
|
|
* a DONE has been received.
|
|
*/
|
|
SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE,
|
|
|
|
/**
|
|
* This PHY information field contains the number of times the phy
|
|
* failed to achieve DWORD synchronization during speed negotiation.
|
|
*/
|
|
SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
|
|
} SCIC_PHY_COUNTER_ID_T;
|
|
|
|
/**
|
|
* @brief This method will enable the user to retrieve information
|
|
* common to all phys, such as: the negotiated link rate,
|
|
* the phy id, etc.
|
|
*
|
|
* @param[in] phy This parameter specifies the phy for which to retrieve
|
|
* the properties.
|
|
* @param[out] properties This parameter specifies the properties
|
|
* structure into which to copy the requested information.
|
|
*
|
|
* @return Indicate if the user specified a valid phy.
|
|
* @retval SCI_SUCCESS This value is returned if the specified phy was valid.
|
|
* @retval SCI_FAILURE_INVALID_PHY This value is returned if the specified phy
|
|
* is not valid. When this value is returned, no data is copied to the
|
|
* properties output parameter.
|
|
*/
|
|
SCI_STATUS scic_phy_get_properties(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_PHY_PROPERTIES_T * properties
|
|
);
|
|
|
|
/**
|
|
* @brief This method will enable the user to retrieve information
|
|
* specific to a SAS phy, such as: the received identify
|
|
* address frame, received phy capabilities, etc.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to
|
|
* retrieve properties.
|
|
* @param[out] properties This parameter specifies the properties
|
|
* structure into which to copy the requested information.
|
|
*
|
|
* @return This method returns an indication as to whether the SAS
|
|
* phy properties were successfully retrieved.
|
|
* @retval SCI_SUCCESS This value is returned if the SAS properties
|
|
* are successfully retrieved.
|
|
* @retval SCI_FAILURE This value is returned if the SAS properties
|
|
* are not successfully retrieved (e.g. It's not a SAS Phy).
|
|
*/
|
|
SCI_STATUS scic_sas_phy_get_properties(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_SAS_PHY_PROPERTIES_T * properties
|
|
);
|
|
|
|
/**
|
|
* @brief This method will enable the user to retrieve information
|
|
* specific to a SATA phy, such as: the recieved signature
|
|
* FIS, if a port selector is present, etc.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to
|
|
* retrieve properties.
|
|
* @param[out] properties This parameter specifies the properties
|
|
* structure into which to copy the requested information.
|
|
*
|
|
* @return This method returns an indication as to whether the SATA
|
|
* phy properties were successfully retrieved.
|
|
* @retval SCI_SUCCESS This value is returned if the SATA properties
|
|
* are successfully retrieved.
|
|
* @retval SCI_FAILURE This value is returned if the SATA properties
|
|
* are not successfully retrieved (e.g. It's not a SATA Phy).
|
|
*/
|
|
SCI_STATUS scic_sata_phy_get_properties(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_SATA_PHY_PROPERTIES_T * properties
|
|
);
|
|
|
|
/**
|
|
* @brief This method allows the SCIC user to instruct the SCIC
|
|
* implementation to send the SATA port selection signal.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to send
|
|
* the port selection signal.
|
|
*
|
|
* @return An indication of whether the port selection signal was
|
|
* successfully executed.
|
|
* @retval SCI_SUCCESS This value is returned if the port selection signal
|
|
* was successfully transmitted.
|
|
*/
|
|
SCI_STATUS scic_sata_phy_send_port_selection_signal(
|
|
SCI_PHY_HANDLE_T phy
|
|
);
|
|
|
|
/**
|
|
* @brief This method requests the SCI implementation to begin tracking
|
|
* information specified by the supplied parameters.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to enable
|
|
* the information type.
|
|
* @param[in] counter_id this parameter specifies the information
|
|
* type to be enabled.
|
|
*
|
|
* @return Indicate if enablement of the information type was successful.
|
|
* @retval SCI_SUCCESS This value is returned if the information type was
|
|
* successfully enabled.
|
|
* @retval SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD This value is returned
|
|
* if the supplied information type is not supported.
|
|
*/
|
|
SCI_STATUS scic_phy_enable_counter(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_PHY_COUNTER_ID_T counter_id
|
|
);
|
|
|
|
/**
|
|
* @brief This method requests the SCI implementation to stop tracking
|
|
* information specified by the supplied parameters.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to disable
|
|
* the information type.
|
|
* @param[in] counter_id this parameter specifies the information
|
|
* type to be disabled.
|
|
*
|
|
* @return Indicate if disablement of the information type was successful.
|
|
* @retval SCI_SUCCESS This value is returned if the information type was
|
|
* successfully disabled.
|
|
* @retval SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD This value is returned
|
|
* if the supplied information type is not supported.
|
|
*/
|
|
SCI_STATUS scic_phy_disable_counter(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_PHY_COUNTER_ID_T counter_id
|
|
);
|
|
|
|
/**
|
|
* @brief This method requests the SCI implementation to retrieve
|
|
* tracking information specified by the supplied parameters.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to retrieve
|
|
* the information type.
|
|
* @param[in] counter_id this parameter specifies the information
|
|
* type to be retrieved.
|
|
* @param[out] data this parameter is a 32-bit pointer to a location
|
|
* where the data being retrieved is to be placed.
|
|
*
|
|
* @return Indicate if retrieval of the information type was successful.
|
|
* @retval SCI_SUCCESS This value is returned if the information type was
|
|
* successfully retrieved.
|
|
* @retval SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD This value is returned
|
|
* if the supplied information type is not supported.
|
|
*/
|
|
SCI_STATUS scic_phy_get_counter(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_PHY_COUNTER_ID_T counter_id,
|
|
U32 * data
|
|
);
|
|
|
|
/**
|
|
* @brief This method requests the SCI implementation to clear (reset)
|
|
* tracking information specified by the supplied parameters.
|
|
*
|
|
* @param[in] phy this parameter specifies the phy for which to clear
|
|
* the information type.
|
|
* @param[in] counter_id this parameter specifies the information
|
|
* type to be cleared.
|
|
*
|
|
* @return Indicate if clearing of the information type was successful.
|
|
* @retval SCI_SUCCESS This value is returned if the information type was
|
|
* successfully cleared.
|
|
* @retval SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD This value is returned
|
|
* if the supplied information type is not supported.
|
|
*/
|
|
SCI_STATUS scic_phy_clear_counter(
|
|
SCI_PHY_HANDLE_T phy,
|
|
SCIC_PHY_COUNTER_ID_T counter_id
|
|
);
|
|
|
|
/**
|
|
* @brief This method will attempt to stop the phy object.
|
|
*
|
|
* @param[in] this_phy
|
|
*
|
|
* @return SCI_STATUS
|
|
* @retval SCI_SUCCESS if the phy is going to stop
|
|
* SCI_INVALID_STATE if the phy is not in a valid state
|
|
* to stop
|
|
*/
|
|
SCI_STATUS scic_phy_stop(
|
|
SCI_PHY_HANDLE_T phy
|
|
);
|
|
|
|
/**
|
|
* @brief This method will attempt to start the phy object. This
|
|
* request is only valid when the phy is in the stopped
|
|
* state
|
|
*
|
|
* @param[in] this_phy
|
|
*
|
|
* @return SCI_STATUS
|
|
*/
|
|
SCI_STATUS scic_phy_start(
|
|
SCI_PHY_HANDLE_T phy
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|
|
|
|
#endif // _SCIC_PHY_H_
|
|
|