#ifndef _SCIF_SAS_SMP_REMOTE_DEVICE_H_
#define _SCIF_SAS_SMP_REMOTE_DEVICE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <dev/isci/scil/sci_fast_list.h>
#include <dev/isci/scil/scif_sas_smp_phy.h>
struct SCIF_SAS_CONTROLLER;
struct SCIF_SAS_REMOTE_DEVICE;
struct SCIF_SAS_INTERNAL_IO_REQUEST;
struct SCIF_SAS_REQUEST;
struct SCIF_SAS_SMP_PHY;
#define SMP_REQUEST_RETRY_WAIT_DURATION 20
#define SMP_SPINUP_HOLD_RELEASE_WAIT_DURATION 100
#define NOT_IN_SMP_ACTIVITY 0xff
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_NONE 0x0
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_DISCOVER 0x1
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_TARGET_RESET 0x2
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_SATA_SPINUP_HOLD_RELEASE 0x3
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_CONFIG_ROUTE_TABLE 0x4
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_CLEAN_ROUTE_TABLE 0x5
#define SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_CLEAR_AFFILIATION 0x6
#define SCIF_SAS_CONFIG_ROUTE_TABLE_LOWEST_PHY_ONLY 0
#define SCIF_SAS_CONFIG_ROUTE_TABLE_MIDDLE_PHY_ONLY 1
#define SCIF_SAS_CONFIG_ROUTE_TABLE_HIGHEST_PHY_ONLY 2
#define SCIF_SAS_CONFIG_ROUTE_TABLE_ALL_PHYS 3
typedef struct SCIF_SAS_SMP_REMOTE_DEVICE
{
U32 current_smp_request;
U8 current_activity;
U8 current_activity_phy_index;
U16 curr_config_route_index;
BOOL is_route_table_cleaned;
struct SCIF_SAS_SMP_PHY * config_route_smp_phy_anchor;
struct SCIF_SAS_SMP_PHY * curr_config_route_destination_smp_phy;
struct SCIF_SAS_SMP_PHY * curr_clear_affiliation_phy;
U8 scheduled_activity;
void * smp_activity_timer;
U8 io_retry_count;
U8 number_of_phys;
U16 expander_route_indexes;
BOOL is_table_to_table_supported;
BOOL is_externally_configurable;
BOOL is_able_to_config_others;
SCI_FAST_LIST_T smp_phy_list;
}SCIF_SAS_SMP_REMOTE_DEVICE_T;
void scif_sas_smp_remote_device_clear(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_construct(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
SCI_STATUS scif_sas_smp_remote_device_decode_smp_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REQUEST * fw_request,
void * response_data,
SCI_IO_STATUS completion_status
);
SCI_STATUS scif_sas_smp_remote_device_decode_report_general_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_initial_discover_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_report_phy_sata_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_target_reset_phy_control_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_discover_phy_control_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_target_reset_discover_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_spinup_hold_release_discover_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
SCI_STATUS scif_sas_smp_remote_device_decode_config_route_info_response(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_T * smp_response
);
void scif_sas_smp_remote_device_start_discover(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_continue_discover(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_finish_initial_discover(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_finish_discover(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_continue_target_reset(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REQUEST * fw_request
);
void scif_sas_smp_remote_device_fail_discover(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_fail_target_reset(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REQUEST * fw_request
);
void scif_sas_smp_remote_device_continue_current_activity(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REQUEST * fw_request,
SCI_STATUS status
);
void scif_sas_smp_remote_device_target_reset_poll(
struct SCIF_SAS_REQUEST * fw_request
);
void scif_sas_smp_remote_device_sata_spinup_hold_release(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_fail_target_spinup_hold_release(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REMOTE_DEVICE * target_device
);
void scif_sas_smp_remote_device_retry_internal_io(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
U8 io_retry_count,
U32 delay
);
BOOL scif_sas_smp_remote_device_is_in_activity(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
SCIF_SAS_SMP_PHY_T * scif_sas_smp_remote_device_find_smp_phy_by_id(
U8 phy_identifier,
struct SCIF_SAS_SMP_REMOTE_DEVICE * smp_remote_device
);
void scif_sas_smp_remote_device_removed(
struct SCIF_SAS_REMOTE_DEVICE * this_device
);
void scif_sas_smp_remote_device_terminated_request_handler(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
struct SCIF_SAS_REQUEST * fw_request
);
void scif_sas_smp_remote_device_populate_smp_phy_list(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
SCI_STATUS scif_sas_smp_remote_device_save_smp_phy_info(
struct SCIF_SAS_REMOTE_DEVICE * fw_device,
SMP_RESPONSE_DISCOVER_T * discover_response
);
#ifdef SCI_SMP_PHY_LIST_DEBUG_PRINT
void scif_sas_smp_remote_device_print_smp_phy_list(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
#endif
void scif_sas_smp_remote_device_configure_upstream_expander_route_info(
struct SCIF_SAS_REMOTE_DEVICE * this_device
);
struct SCIF_SAS_REMOTE_DEVICE * scif_sas_remote_device_find_upstream_expander(
struct SCIF_SAS_REMOTE_DEVICE * this_device
);
struct SCIF_SAS_REMOTE_DEVICE * scif_sas_remote_device_find_downstream_expander(
struct SCIF_SAS_REMOTE_DEVICE * this_device
);
BOOL scif_sas_smp_remote_device_do_config_route_info(
struct SCIF_SAS_REMOTE_DEVICE * device_being_config,
struct SCIF_SAS_SMP_PHY * destination_smp_phy
);
void scif_sas_smp_remote_device_configure_route_table(
struct SCIF_SAS_REMOTE_DEVICE * device_being_config
);
void scif_sas_smp_remote_device_clean_route_table(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_clean_route_table_entry(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_cancel_config_route_table_activity(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_cancel_smp_activity(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
U8 scif_sas_smp_remote_device_get_config_route_table_method(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_start_clear_affiliation(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_continue_clear_affiliation(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_finish_clear_affiliation(
struct SCIF_SAS_REMOTE_DEVICE * fw_device
);
void scif_sas_smp_remote_device_start_target_reset(
struct SCIF_SAS_REMOTE_DEVICE * expander_device,
struct SCIF_SAS_REMOTE_DEVICE * target_device,
struct SCIF_SAS_REQUEST * fw_request
);
#ifdef __cplusplus
}
#endif
#endif