44 #if !defined(OCSU_FC_RAMD) && !defined(OCSU_FC_WORKLOAD) && !defined(OCS_USPACE_SPDK)
45 ocs_t *other_ocs = NULL;
46 uint8_t bus, dev, func;
47 uint8_t other_bus, other_dev, other_func;
53 if ((bus == other_bus) && (dev == other_dev)) {
54 if (port_reset && (func != other_func)) {
60 ocs_log_info(other_ocs,
"Start EQ processing\n");
63 ocs_log_info(other_ocs,
"Stop EQ processing\n");
76 ocs_t *other_ocs = NULL;
77 uint8_t bus, dev, func;
78 uint8_t other_bus, other_dev, other_func;
84 if ((bus == other_bus) && (dev == other_dev)) {
85 if (port_reset && (func != other_func)) {
102 uint8_t bus, dev, func;
103 uint8_t other_bus, other_dev, other_func;
109 if ((bus == other_bus) && (dev == other_dev)) {
110 if (port_reset && (func != other_func)) {
115 #if !defined(OCSU_FC_RAMD) && !defined(OCSU_FC_WORKLOAD) && !defined(OCS_USPACE_SPDK)
116 if (other_ocs->domain) {
117 ocs_sport_t *sport = NULL;
136 uint8_t bus, dev, func;
137 uint8_t other_bus, other_dev, other_func;
143 if ((bus == other_bus) && (dev == other_dev)) {
144 if (port_reset && (func != other_func)) {
148 ocs_log_debug(other_ocs,
"Initiate transport shutdown\n");
150 ocs_log_err(other_ocs,
"Tranport shutdown failed\n");
162 uint8_t bus, dev, func;
163 uint8_t other_bus, other_dev, other_func;
170 if ((bus == other_bus) && (dev == other_dev)) {
171 if (port_reset && (func != other_func)) {
177 ocs_log_err(other_ocs,
"Unable to bring-up the link\n");
193 ocs_thread_terminate(&ocs_recovery.
thread);
194 ocs_lock_free(&ocs_recovery.
lock);
195 ocs_log_info(NULL,
"FW error recovery thread terminated\n");
203 ocs_lock(&ocs_recovery.
lock);
204 ocs_recovery.
state = state;
205 ocs_unlock(&ocs_recovery.
lock);
217 ocs_lock(&ocs_recovery.
lock);
218 if (ocs_recovery.
state == state) {
221 ocs_unlock(&ocs_recovery.
lock);
234 uint8_t bus, dev, func;
235 uint8_t other_bus, other_dev, other_func;
241 if ((bus == other_bus) && (dev == other_dev)) {
252 ocs_lock(&other_ocs->fw_dump.lock);
253 other_ocs->fw_dump.state = state;
254 ocs_unlock(&other_ocs->fw_dump.lock);
266 ocs_dma_t *dump_buffers = NULL;
267 uint8_t *saved_buff = NULL;
268 uint8_t bus, dev, func;
269 uint8_t other_bus, other_dev, other_func;
272 uint32_t num_buffers = 0;
273 uint32_t saved_buff_size = 0;
276 dump_buffers = ocs->fw_dump.func_dump_buffers;
277 num_buffers = ocs->fw_dump.num_func_dump_buffers;
278 saved_buff = ocs->fw_dump.saved_buff;
279 saved_buff_size = ocs->fw_dump.size;
284 if ((bus == other_bus) && (dev == other_dev) && (0 == other_func)) {
285 dump_buffers = other_ocs->fw_dump.chip_dump_buffers;
286 num_buffers = other_ocs->fw_dump.num_chip_dump_buffers;
287 saved_buff = other_ocs->fw_dump.saved_buff;
288 saved_buff_size = other_ocs->fw_dump.size;
294 if (!dump_buffers || !num_buffers || !saved_buff) {
295 ocs_log_err(ocs,
"Failed to locate dump buffers\n");
299 ocs_memset(saved_buff, 0, saved_buff_size);
300 for (index = 0; index < num_buffers; index++) {
301 if (ocs_memcpy(saved_buff + offset, dump_buffers[index].virt,
302 dump_buffers[index].size) == NULL) {
303 ocs_log_err(ocs,
"ocs_memcpy() failed\n");
307 offset += dump_buffers[index].size;
310 ocs_log_info(ocs,
"FW dump is saved\n");
327 uint32_t skip_dump = FALSE;
363 bool port_reset = FALSE;
364 uint8_t bus, dev, func;
387 ocs_log_info(ocs,
"FW dump is already in progress\n");
393 ocs_log_err(ocs,
"FW dump has failed\n");
404 ocs_log_err(ocs,
"Port migration has failed\n");
427 ocs_log_info(ocs,
"OCS port (%02d:%02d:%02d) reset has %s\n",
428 bus, dev, func, (rc ?
"failed" :
"succeeded"));
431 ocs_log_info(ocs,
"OCS adapter (%02d:%02d) reset has %s\n",
432 bus, dev, (rc ?
"failed" :
"succeeded"));
441 ocs_log_err(ocs,
"Failed to bring ports online\n");
459 ocs_log_debug(ocs,
"FW dump is already present\n");
466 ocs_log_debug(ocs,
"FW dump is already in progress\n");
469 ocs_log_err(ocs,
"FW dump failed\n");
473 ocs_log_info(ocs,
"FW dump is generated\n");
485 ocs_log_err(ocs,
"Flash gendump is disabled\n");
491 ocs_log_err(ocs,
"ocs_initiate_gendump() failed\n");
506 int32_t ms_waited = 0;
509 ocs_log_info(ocs,
"Waiting for FW dump to be completed\n");
511 ocs_delay_usec(10000);
516 ocs_log_err(ocs,
"FW dump timedout=%d(msec)\n", ms_waited);
526 ocs_delay_usec(10000);
531 ocs_log_err(ocs,
"Recovery timedout=%d(msec)\n", ms_waited);
545 uint32_t user_buflen, uint8_t dump_state)
547 uint8_t *saved_buff = ocs->fw_dump.saved_buff;
548 uint32_t size = ocs->fw_dump.size;
551 ocs_log_warn(ocs,
"FW dump is not present in the OCS buffers\n");
557 if (ocs_copy_to_user(user_buff, saved_buff, size)) {
558 ocs_log_err(ocs,
"ocs_copy_to_user() failed\n");
584 ocs_dma_t *dump_buffers = NULL;
585 uint8_t bus, dev, func;
586 uint8_t other_bus, other_dev, other_func;
589 uint32_t num_buffers = 0;
592 ocs_log_err(ocs,
"Dump to host is disabled\n");
597 ocs_log_err(ocs,
"Zero buffer length is invalid\n");
602 dump_buffers = ocs->fw_dump.func_dump_buffers;
603 num_buffers = ocs->fw_dump.num_func_dump_buffers;
608 if ((bus == other_bus) && (dev == other_dev) && (0 == other_func)) {
609 dump_buffers = other_ocs->fw_dump.chip_dump_buffers;
610 num_buffers = other_ocs->fw_dump.num_chip_dump_buffers;
616 if (!dump_buffers || !num_buffers) {
617 ocs_log_err(ocs,
"No pre-allocated FW dump memory\n");
623 ocs_log_err(ocs,
"ocs_initiate_gendump() failed\n");
628 ocs_log_debug(ocs,
"Waiting for the already triggered FW dump to complete\n");
636 ocs_log_err(ocs,
"FW dump copy to user failed\n");
638 ocs_log_info(ocs,
"FW dump to host is successful\n");
652 uint8_t bus, dev, func;
657 bool trigger_dump =
true;
661 ocs_log_info(ocs,
"Adapter recovery is already in progress\n");
666 ocs_log_crit(ocs,
"OCS adapter %02d:%02d recovery started for UE "
667 "status=%#x error1=%#x error2=%#x\n", bus, dev,
675 trigger_dump =
false;
699 uint32_t fw_err_detected;
701 while (!ocs_thread_terminate_requested(th)) {
708 fw_err_detected = FALSE;
711 fw_err_detected = TRUE;
714 fw_err_detected = FALSE;
718 if (!fw_err_detected)
724 ocs_log_info(ocs,
"FW error recovery is already in progress\n");
726 ocs_log_info(ocs,
"FW error recovery is successful\n");
729 ocs_log_err(ocs,
"FW error recovery has failed\n");
746 ocs_lock_init(NULL, &ocs_recovery.
lock,
"fw_err_recovery_lock");
749 rc = ocs_thread_create(NULL, &ocs_recovery.
thread,
751 NULL, OCS_THREAD_RUN);
753 ocs_log_err(NULL,
"Failed to create FW err detection thread\n");
765 ocs_lock_init(ocs, &ocs->fw_dump.lock,
"fw_dump_lock[%d]",
ocs_instance(ocs));
767 ocs->fw_dump.type = fw_dump_type;
768 ocs->fw_dump.chip_dump_buffers = NULL;
769 ocs->fw_dump.func_dump_buffers = NULL;
770 ocs->fw_dump.num_chip_dump_buffers = 0;
771 ocs->fw_dump.num_func_dump_buffers = 0;
int32_t ocs_scsi_tgt_port_online(ocs_t *ocs)
uint32_t ocs_instance(void *os)
Return instance index of an opaque ocs structure.
#define OCS_DDUMP_FLAGS_WQES
int32_t ocs_adapter_ddump_clear_and_save(ocs_t *ocs, uint8_t bus, uint8_t dev, uint32_t flags, uint32_t qentries, uint32_t alloc_flag)
Clear the previously saved ddump, and collect the ddump for all OCS instances of the adapter...
int32_t sli_fw_error_status(sli4_t *sli4)
Read the SLIPORT_SEMAPHORE and SLIPORT_STATUS registers to check if the port status indicates that a ...
#define OCS_RECOVERY_STATUS_IN_PROGRESS
#define SLI4_FW_READY_TIMEOUT_MSEC
ocs_hal_rtn_e ocs_hal_port_migration(ocs_hal_t *hal)
#define OCS_FW_DUMP_STATUS_SUCCESS
void sli_validate_pause_errors(sli4_t *sli4, uint32_t *skip_dump)
#define OCS_RECOVERY_STATUS_FAILED
static int32_t ocs_adapter_recover(ocs_t *ocs, uint32_t mode)
Recover adapter from chip error.
static int32_t ocs_recovery_state_check(uint32_t state)
Check recovery state.
int32_t ocs_trigger_dump(ocs_t *ocs, uint8_t dump_level)
static int32_t ocs_fw_dump_save(ocs_t *ocs, uint8_t dump_level)
Save dump data to OCS buffer; saved_buff will be copied to the user space buffer when an application ...
void ocs_fw_err_recovery_stop(void)
Stop FW error recovery thread.
static void ocs_adapter_sport_shutdown(ocs_t *ocs, bool port_reset)
Shutdown sport(s) for all the ocs instances of the adapter.
int32_t ocs_fw_dump_state_check(ocs_t *ocs, uint32_t state)
Check the fw dump state.
void ocs_fw_dump_init(ocs_t *ocs, int32_t fw_dump_type)
Initialize fw dump context.
static int32_t ocs_fw_dump_ready_wait(ocs_t *ocs, uint8_t dump_state)
Waits for FW_DUMP_PRESENT flag to be set in fw_dump.flags context, and if recovery is started...
#define FW_FUNC_DUMP_STATE_VALID
#define OCS_RECOVERY_STATE_IN_PROGRESS
#define OCS_RECOVERY_STATE_IDLE
#define OCS_RESET_MODE_PORT_MIGRATION
static void ocs_domain_unlock(ocs_domain_t *domain)
static void ocs_adapter_hal_inactive(ocs_t *ocs, bool port_reset)
Set OCS HAL state to inactive for all the ocs instances of the adapter.
#define OCS_FW_DUMP_STATUS_IN_PROGRESS
#define OCS_RECOVERY_MODE_AUTO
int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd,...)
Perform transport attach function.
#define SLI4_FW_DUMP_TIMEOUT_MSEC
int32_t ocs_fw_err_recovery_setup(void)
Create a FW error recovery thread.
#define OCS_RECOVERY_MODE_MANUAL
int32_t ocs_start_event_processing(ocs_os_t *ocs_os)
#define FW_DUMP_LEVEL_NONE
static int32_t ocs_fw_dump_req(ocs_t *ocs, uint8_t dump_level)
Request FW dump.
static int32_t ocs_recovery_thread(ocs_thread_t *th)
OCS FW error recovery thread.
static int32_t ocs_fw_dump_copy_to_user(ocs_t *ocs, uint8_t *user_buff, uint32_t user_buflen, uint8_t dump_state)
Copy dump buffers to user space buffer.
int32_t ocs_adapter_reset(ocs_t *ocs)
#define FW_CHIP_DUMP_STATE_VALID
ocs_t * ocs_get_instance(uint32_t index)
return pointer to ocs structure given instance index
#define SLI4_SLIPORT_ERROR1_RQ_EMPTY_TIMEOUT
#define OCS_RECOVERY_STATUS_SUCCESS
#define FW_DUMP_TYPE_DUMPTOHOST
#define FW_FUNC_DESC_DUMP
void ocs_scsi_tgt_cancel_io(ocs_t *ocs)
int32_t ocs_dump_to_host(ocs_t *ocs, void *buf, uint32_t buflen, uint8_t dump_level)
Create a Lancer dump into a memory buffer.
#define FW_CHIP_LEVEL_DUMP
uint32_t sli_reg_read(sli4_t *sli, sli4_regname_e reg)
Read the given SLI register.
int32_t ocs_gendump(ocs_t *ocs, uint8_t dump_level)
static void ocs_adapter_xport_shutdown(ocs_t *ocs, bool port_reset)
Shutdown xport(s) for all the ocs instances of the adapter.
static void ocs_domain_lock(ocs_domain_t *domain)
int32_t ocs_recovery_reset(ocs_t *ocs, uint32_t reset_mode, uint8_t dump_level, bool trigger_dump)
Initiate FW dump and do reset.
void ocs_fw_dump_state_set(ocs_t *ocs, uint32_t state)
Set fW dump state.
void ocs_stop_event_processing(ocs_os_t *ocs_os)
int32_t ocs_get_bus_dev_func(ocs_t *ocs, uint8_t *bus, uint8_t *dev, uint8_t *func)
int32_t sli_is_paused(sli4_t *sli4)
static void ocs_recovery_state_set(uint32_t state)
Set recovery state.
#define ocs_assert(cond,...)
static int32_t ocs_initiate_gendump(ocs_t *ocs, uint8_t dump_level)
int32_t ocs_port_reset(ocs_t *ocs)
static void ocs_adapter_event_processing(ocs_t *ocs, bool port_reset, bool start)
Handle the EQ processing for all the ocs instances of the adapter.
#define FW_DUMP_STATE_NONE
#define OCS_FW_DUMP_STATUS_FAILED
#define ocs_list_foreach(list, item)
Iterate a linked list.
void ocs_sport_nodes_shutdown(ocs_t *ocs, ocs_sport_t *sport)
Shutdown all remote nodes of sport.
#define OCS_DDUMP_FLAGS_CQES
#define FW_DUMP_TYPE_FLASH
static int32_t ocs_adapter_xport_online(ocs_t *ocs, bool port_reset)
Bring the links online.
ocs_fw_error_recovery_t ocs_recovery
#define OCS_DDUMP_FLAGS_MQES