34 #include "ocs_driver.h"
43 #include "ocs_params.h"
52 void *arg_out, uint32_t arg_out_length,
void *driver);
53 int ocs_run_link_loopback(ocs_t *ocs,
void *tx_buf, uint32_t tx_buflen,
void *rx_buf, uint32_t rx_buflen);
54 int ocs_run_pci_loopback(ocs_t *ocs,
void *tx_buf, uint32_t tx_buflen,
void *rx_buf, uint32_t rx_buflen);
59 void *user_rx_buf, uint32_t rx_buf_len);
68 #define FW_WRITE_BUFSIZE 64*1024
69 typedef struct ocs_fw_write_result {
77 #define INTERNAL_LOOPBACK 0x1
78 #define EXTERNAL_LOOPBACK 0x2
79 #define PCI_LOOPBACK 0x3
80 #define LOOPBACK_FRAME_TIMEOUT_SEC 5
91 uint32_t fw_diag_log_size = 0;
92 uint32_t fw_diag_log_level = 1;
98 fw_diag_log_size = ocs_strtoul(prop_buf, &p, 0);
101 fw_diag_log_size *= 1024;
104 fw_diag_log_size *= 1024;
108 fw_diag_log_size *= 0;
110 if (fw_diag_log_size) {
122 if (
ocs_get_property(
"fw_diag_log_level", prop_buf,
sizeof(prop_buf)) == 0) {
123 fw_diag_log_level = ocs_strtoul(prop_buf, 0, 0);
155 ocs_log_err(NULL,
"ocs_scsi_tgt_init failed rc=%d\n", rc);
164 if (initiator || target) {
167 ocs_log_err(NULL,
"ocs_scsi_ini_init failed rc=%d\n", rc);
189 int32_t rc, index = 0;
192 if (enable_auto_recovery) {
195 ocs_log_err(NULL,
"Failed to setup FW error recovery\n");
200 if (holdoff_link_online == 1) {
220 if (enable_auto_recovery) {
235 if (initiator || target) {
259 ocs = ocs_malloc(NULL,
sizeof(*ocs), OCS_M_NOWAIT | OCS_M_ZERO);
261 ocs = ocs_malloc_nid(nid,
sizeof(*ocs), OCS_M_NOWAIT | OCS_M_ZERO);
266 ocs->instance_index = i;
273 ocs_log_err(NULL,
"failed\n");
274 ocs_free(ocs, ocs,
sizeof(*ocs));
283 if (ocs->ramlog == NULL) {
289 if (ddump_saved_size) {
291 ocs_log_err(ocs,
"failed to allocate memory for saved ddump\n");
295 #if defined(ENABLE_LOCK_DEBUG)
297 ocs_lock_init(NULL, &ocs->ocs_os.locklist_lock,
"locklist_lock[%d]", ocs->instance_index);
302 ocs->drv_ocs.attached = FALSE;
303 ocs->ocs_os.hw_cmpl_context = hw_cmpl_context;
305 #ifdef OCS_DEBUG_MEMORY
306 ocs_memory_tracker_init(ocs, &ocs->ocs_os.tracker);
328 #if defined(ENABLE_LOCK_DEBUG)
330 ocs_os_t *os = &ocs->ocs_os;
334 ocs_log_debug(os,
"%s not freed\n", l->name);
338 ocs_log_debug(ocs,
"all lock objects freed\n");
342 #ifdef OCS_DEBUG_MEMORY
343 ocs_memory_allocated_print(&ocs->ocs_os.tracker);
344 ocs_memory_tracker_teardown(&ocs->ocs_os.tracker);
346 ocs_free(NULL, ocs,
sizeof(*ocs));
380 if (ocs->drv_ocs.attached) {
381 ocs_log_warn(ocs,
"Device is already attached\n");
384 ocs_snprintf(ocs->display_name,
sizeof(ocs->display_name),
"[%s%d] ",
"fc", ocs->instance_index);
386 ocs->logmask = logmask;
387 ocs->enable_ini = initiator;
388 ocs->enable_tgt = target;
389 ocs->ctrlmask = ctrlmask;
390 ocs->topology = topology;
392 ocs->ethernet_license = ethernet_license;
393 ocs->num_scsi_ios = num_scsi_ios;
394 ocs->enable_hlm = enable_hlm;
395 ocs->enable_dpp = enable_dpp;
396 ocs->hlm_group_size = hlm_group_size;
397 ocs->max_remote_nodes = max_remote_nodes;
398 ocs->hal_war_version = hal_war_version;
399 ocs->watchdog_timeout = watchdog_timeout;
400 ocs->sliport_healthcheck = sliport_healthcheck;
401 ocs->disable_fec = disable_fec;
402 ocs->enable_fw_ag_rsp = enable_fw_ag_rsp;
403 ocs->sliport_pause_errors = sliport_pause_errors;
404 ocs->enable_bbcr = enable_bbcr;
405 ocs->enable_auto_recovery = enable_auto_recovery;
406 #if defined(OCS_INCLUDE_RAMD)
408 ocs->num_vports = num_vports;
410 ocs->max_isr_time_msec = OCS_OS_MAX_ISR_TIME_MSEC;
411 ocs->explicit_buffer_list = explicit_buffer_list;
412 ocs->model = ocs_pci_model(ocs->pci_vendor, ocs->pci_device);
416 ocs->external_loopback = external_loopback;
417 ocs->target_io_timer_sec = target_io_timer;
418 ocs->tgt_wqe_timer = target_wqe_timer;
420 ocs->tgt_rscn_delay_msec = 0;
421 ocs->tgt_rscn_period_msec = 0;
423 ocs->hal_bounce = hal_bounce;
424 ocs->rq_threads = rq_threads;
425 ocs->rq_selection_policy = rq_selection_policy;
426 ocs->cq_process_limit = cq_process_limit;
427 ocs->rr_quanta = rr_quanta;
428 ocs->filter_def = filter_def;
429 ocs->ocs_req_fw_upgrade = ocs_req_fw_upgrade;
430 ocs->cfg_suppress_rsp = cfg_suppress_rsp;
432 if (ocs->max_remote_nodes > MAX_REMOTE_NODES_ALLOWED) {
433 ocs_log_err(ocs,
"failed to allocate %d number of remote nodes, max remote nodes allowed is 8192\n ",ocs->max_remote_nodes);
439 ocs_log_info(ocs,
"Module param FW dump type is invalid. "
440 "Using FW dump type as default\n");
441 fw_dump_type = MODPARAM_DEF_FW_DUMP_TYPE;
445 ocs_lock_init(ocs, &ocs->domain_list_empty_cb_lock,
448 if (target_wqe_timer > MAX_TARGET_WQE_TIMER) {
449 ocs_log_err(ocs,
"Invalid target wqe timer value %d\n", target_wqe_timer);
454 if (ocs->xport == NULL) {
455 ocs_log_err(ocs,
"failed to allocate transport object\n");
458 ocs_log_err(ocs,
"failed to attach transport object\n");
461 ocs_log_err(ocs,
"failed to initialize transport object\n");
464 ocs_log_err(ocs,
"failed to start event processing\n");
473 if ((holdoff_link_online == 2) && ((!ocs->enable_tgt) && (ocs->enable_ini))) {
474 holdoff_link_online = 0;
475 ocs_log_debug(ocs,
"holdoff_link_online param changed to %d\n",
476 holdoff_link_online);
479 if (holdoff_link_online == 0) {
485 ocs_log_err(ocs,
"failed to bring port online\n");
489 ocs->holdoff_link_online = holdoff_link_online;
497 ocs_lock(&ocs->xport->fc_stats_lock);
498 ocs->xport->fc_stats_timer_shutdown =
false;
499 ocs_unlock(&ocs->xport->fc_stats_lock);
504 ocs->desc = ocs->hal.sli.config.modeldesc;
505 ocs_log_info(ocs,
"adapter model description: %s\n", ocs->hal.sli.config.modeldesc);
508 ocs->drv_ocs.attached = TRUE;
510 if (ocs->ocs_req_fw_upgrade) {
511 ocs_log_debug(ocs,
"firmware update is in progress\n");
516 ocs_teardown_msix((ocs_os_t *)ocs);
517 if (ocs->xport != NULL) {
558 if (!ocs->drv_ocs.attached) {
559 ocs_log_warn(ocs,
"Device is not attached\n");
565 ocs_log_err(ocs,
"Transport Shutdown timed out\n");
569 ocs_log_err(ocs,
"failed to clear FW dump location\n");
575 ocs_log_err(ocs,
"Transport detach failed\n");
581 ocs_lock_free(&ocs->domain_list_empty_cb_lock);
582 ocs->drv_ocs.attached = FALSE;
606 else if (strcmp(prop_name,
"initiator") == 0)
607 ocs_snprintf(buffer, buffer_len,
"%d", initiator);
608 else if (strcmp(prop_name,
"target") == 0)
609 ocs_snprintf(buffer, buffer_len,
"%d", target);
610 else if (strcmp(prop_name,
"wwn_bump") == 0)
611 ocs_snprintf(buffer, buffer_len,
"%s", wwn_bump);
612 else if (strcmp(prop_name,
"dif_separate") == 0)
613 ocs_snprintf(buffer, buffer_len,
"%d", dif_separate);
614 else if (strcmp(prop_name,
"p_type") == 0)
615 ocs_snprintf(buffer, buffer_len,
"%d", p_type);
616 else if (strcmp(prop_name,
"fw_diag_log_level") == 0)
617 ocs_snprintf(buffer, buffer_len,
"%d", fw_diag_log_level);
618 else if (strcmp(prop_name,
"fw_diag_log_size") == 0)
619 ocs_snprintf(buffer, buffer_len,
"%s", fw_diag_log_size);
620 else if (strcmp(prop_name,
"tow_feature") == 0)
621 ocs_snprintf(buffer, buffer_len,
"%d", tow_feature);
622 else if (strcmp(prop_name,
"tow_io_size") == 0)
623 ocs_snprintf(buffer, buffer_len,
"%d", tow_io_size);
624 else if (strcmp(prop_name,
"tow_xri_cnt") == 0)
625 ocs_snprintf(buffer, buffer_len,
"%d", tow_xri_cnt);
626 #if defined(OCS_INCLUDE_SCST)
627 else if (strcmp(prop_name,
"scst_sg_table_size") == 0)
628 ocs_snprintf(buffer, buffer_len,
"%d", scst_sg_table_size);
630 #if defined(OCS_INCLUDE_RAMD)
631 else if (strcmp(prop_name,
"global_ramdisc") == 0)
632 ocs_snprintf(buffer, buffer_len,
"%d", global_ramdisc);
633 else if (strcmp(prop_name,
"ramdisc_size") == 0)
634 ocs_strncpy(buffer, ramdisc_size, buffer_len);
635 else if (strcmp(prop_name,
"ramdisc_blocksize") == 0)
636 ocs_snprintf(buffer, buffer_len,
"%d", ramdisc_blocksize);
637 else if (strcmp(prop_name,
"num_luns") == 0)
638 ocs_snprintf(buffer, buffer_len,
"%d", num_luns);
639 else if (strcmp(prop_name,
"stub_res6_rel6") == 0)
640 ocs_snprintf(buffer, buffer_len,
"%d", stub_res6_rel6);
641 else if (strcmp(prop_name,
"ramd_threading") == 0)
642 ocs_snprintf(buffer, buffer_len,
"%d", ramd_threading);
643 else if (strcmp(prop_name,
"thread_cmds") == 0)
644 ocs_snprintf(buffer, buffer_len,
"%d",
thread_cmds);
645 else if (strcmp(prop_name,
"external_dif") == 0)
646 ocs_strncpy(buffer, external_dif, buffer_len);
647 else if (strcmp(prop_name,
"esoc") == 0)
648 ocs_snprintf(buffer, buffer_len,
"%d", esoc);
649 #if defined(OCS_DISC_SPIN_DELAY)
650 else if (strcmp(prop_name,
"disk_spin_delay") == 0)
651 ocs_snprintf(buffer, disk_spin_delay,
"%d", disk_spin_delay);
655 ocs_log_debug(NULL,
"Error: unknown property %s\n", prop_name);
656 ocs_snprintf(buffer, buffer_len,
"%s",
"");
663 ocs_fw_write_cb(int32_t status, int32_t ext_status, uint32_t actual_write_length, uint32_t change_status,
void *arg)
686 ocs_sem_init(&(result.
semaphore), 0,
"fw_write");
688 bytes_left = buf_len;
692 ocs_log_err(ocs,
"ocs_firmware_write: malloc failed\n");
696 while (bytes_left > 0) {
701 xfer_size = bytes_left;
704 ocs_memcpy(dma.virt, buf + offset, xfer_size);
706 if (bytes_left == xfer_size) {
712 if (ocs_sem_p(&(result.
semaphore), OCS_SEM_FOREVER) != 0) {
719 ocs_log_err(ocs,
"Firmware does not meet minimum version requirement for this IPL\n");
735 ocs_dma_free(ocs, &dma);
743 uint8_t file_name[256], fw_change_status;
744 const struct firmware *fw;
747 ocs_snprintf(file_name, 256,
"%s.grp", ocs->model);
748 rc = request_firmware(&fw, file_name, &ocs->ocs_os.pdev->dev);
750 ocs_log_err(ocs,
"Firmware file(%s) not found.\n", file_name);
760 "Invalid FW image found Magic: 0x%x Size: %ld \n",
767 if (!strncmp(ocs->fw_version, fw_image->
revision, strnlen(fw_image->
revision, 16))) {
768 ocs_log_debug(ocs,
"No update req. Firmware is already up to date. \n");
774 ocs_log_err(ocs,
"Firmware update failed. Return code = %d\n", rc);
776 ocs_log_info(ocs,
"Firmware updated successfully\n");
777 switch (fw_change_status) {
779 ocs_log_debug(ocs,
"No reset needed, new firmware is active.\n");
783 "A physical device reset (host reboot) is needed to"
784 "activate the new firmware\n");
789 "firmware is resetting to activate the new firmware\n");
794 "Unexected value change_status: %d\n",
802 release_firmware(fw);
826 return ocs->display_name;
846 #if defined(OCS_INCLUDE_FC)
861 #if defined(OCS_INCLUDE_RAMD)
891 snprintf(qualifier,
sizeof(qualifier),
"%s/driver", parent);
894 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
895 char *unqualified_name = name + strlen(qualifier) +1;
900 }
else if (ocs_strcmp(unqualified_name,
"initiator") == 0) {
903 }
else if (ocs_strcmp(unqualified_name,
"target") == 0) {
906 }
else if (ocs_strcmp(unqualified_name,
"logmask") == 0) {
909 }
else if (ocs_strcmp(unqualified_name,
"ctrlmask") == 0) {
912 }
else if (ocs_strcmp(unqualified_name,
"logdest") == 0) {
915 }
else if (ocs_strcmp(unqualified_name,
"ramlog_size") == 0) {
918 }
else if (ocs_strcmp(unqualified_name,
"hal_war_version") == 0) {
921 }
else if (ocs_strcmp(unqualified_name,
"num_scsi_ios") == 0) {
924 }
else if (ocs_strcmp(unqualified_name,
"pm_state") == 0) {
927 }
else if (ocs_strcmp(unqualified_name,
"ddump_saved_size") == 0) {
930 }
else if (ocs_strcmp(unqualified_name,
"dif_separate") == 0) {
933 #if defined(OCS_INCLUDE_FC)
934 }
else if (ocs_strcmp(unqualified_name,
"wwn_bump") == 0) {
937 }
else if (ocs_strcmp(unqualified_name,
"topology") == 0) {
940 }
else if (ocs_strcmp(unqualified_name,
"speed") == 0) {
943 }
else if (ocs_strcmp(unqualified_name,
"holdoff_link_online") == 0) {
946 }
else if (ocs_strcmp(unqualified_name,
"enable_hlm") == 0) {
949 }
else if (ocs_strcmp(unqualified_name,
"enable_dpp") == 0) {
952 }
else if (ocs_strcmp(unqualified_name,
"hlm_group_size") == 0) {
955 }
else if (ocs_strcmp(unqualified_name,
"explicit_buffer_list") == 0) {
958 }
else if (ocs_strcmp(unqualified_name,
"hw_cmpl_context") == 0) {
961 }
else if (ocs_strcmp(unqualified_name,
"external_loopback") == 0) {
964 }
else if (ocs_strcmp(unqualified_name,
"target_io_timer") == 0) {
967 }
else if (ocs_strcmp(unqualified_name,
"target_wqe_timer") == 0) {
971 #if defined(OCS_INCLUDE_RAMD)
972 }
else if (ocs_strcmp(unqualified_name,
"num_luns") == 0) {
975 }
else if (ocs_strcmp(unqualified_name,
"ramdisc_blocksize") == 0) {
978 }
else if (ocs_strcmp(unqualified_name,
"ramdisc_size") == 0) {
981 }
else if (ocs_strcmp(unqualified_name,
"global_ramdisc") == 0) {
984 }
else if (ocs_strcmp(unqualified_name,
"p_type") == 0) {
987 }
else if (ocs_strcmp(unqualified_name,
"stub_res6_rel6") == 0) {
990 }
else if (ocs_strcmp(unqualified_name,
"esoc") == 0) {
1030 #if defined(OCS_INCLUDE_FC)
1044 #if defined(OCS_INCLUDE_RAMD)
1058 #if defined(OCS_DISC_SPIN_DELAY)
1077 uint32_t arg_in_length,
void *arg_out, uint32_t arg_out_length,
void *
object)
1081 ocs_t *ocs = (ocs_t *)
object;
1083 ocs_snprintf(qualifier,
sizeof(qualifier),
"%s/driver", parent);
1086 if (ocs_strncmp(action_name, qualifier, strlen(qualifier)) == 0) {
1087 char *unqualified_name = action_name + strlen(qualifier) +1;
1090 if (ocs_strcmp(unqualified_name,
"gendump") == 0) {
1093 if (ocs_strcmp(unqualified_name,
"fdb_gendump") == 0) {
1096 if (ocs_strcmp(unqualified_name,
"dump_to_host") == 0) {
1099 if (ocs_strcmp(unqualified_name,
"fdb_dump_to_host") == 0) {
1102 if (ocs_strcmp(unqualified_name,
"trunk_mode") == 0) {
1103 uint32_t trunk_mode;
1105 if (arg_in && arg_in_length) {
1106 if (!ocs_copy_from_user(&trunk_mode, arg_in,
1107 MIN(arg_in_length,
sizeof(trunk_mode)))) {
1112 if (ocs_strcmp(unqualified_name,
"trunk_info") == 0) {
1113 uint32_t trunk_info;
1114 if (arg_out && arg_out_length) {
1116 if (retval || ocs_copy_to_user(arg_out, &trunk_info,
1117 MIN(arg_out_length,
sizeof(trunk_info)))) {
1124 if (ocs_strcmp(unqualified_name,
"link_loopback") == 0) {
1127 if (ocs_strcmp(unqualified_name,
"pci_loopback") == 0) {
1130 if (ocs_strcmp(unqualified_name,
"fw_diag_log") == 0) {
1133 if (ocs_strcmp(unqualified_name,
"set_loopback") == 0) {
1134 uint32_t local_arg_in;
1136 if (arg_in && arg_in_length) {
1137 if (!ocs_copy_from_user(&local_arg_in, arg_in,
1138 MIN(arg_in_length,
sizeof(local_arg_in)))) {
1143 if (ocs_strcmp(unqualified_name,
"get_link_state") == 0) {
1147 if (!retval && arg_out) {
1148 if (ocs_copy_to_user(arg_out, &link_status.
value,
sizeof(uint32_t))) {
1153 if (ocs_strcmp(unqualified_name,
"set_link_state") == 0) {
1154 uint32_t local_arg_in;
1156 if (arg_in && arg_in_length) {
1157 if (!ocs_copy_from_user(&local_arg_in, arg_in,
1158 MIN(arg_in_length,
sizeof(local_arg_in)))) {
1164 if (ocs_strcmp(unqualified_name,
"clear_ramlog") == 0) {
1165 char local_arg_in[128];
1166 int clear_start_of_day = 0;
1167 int clear_recent = 0;
1169 if (ocs_copy_from_user(local_arg_in, arg_in,
1170 MIN(arg_in_length,
sizeof(local_arg_in)-1))) {
1171 ocs_log_warn(ocs,
"Error: copy arg_in from user failed\n");
1175 local_arg_in[
sizeof(local_arg_in)-1] = 0;
1176 if (ocs_strcmp(local_arg_in,
"recent") == 0) {
1178 }
else if (ocs_strcmp(local_arg_in,
"start_of_day") == 0) {
1179 clear_start_of_day = 1;
1180 }
else if (ocs_strcmp(local_arg_in,
"all") == 0) {
1182 clear_start_of_day = 1;
1186 clear_start_of_day = 1;
1189 ocs_log_debug(ocs,
"Clear ramlog:%s%s\n", clear_start_of_day ?
" start_of_day" :
"",
1190 clear_recent ?
" recent" :
"");
1195 if (ocs_strcmp(unqualified_name,
"pm_prepare") == 0) {
1198 if (ocs_strcmp(unqualified_name,
"pm_sleep") == 0) {
1201 if (ocs_strcmp(unqualified_name,
"pm_hibernate") == 0) {
1204 if (ocs_strcmp(unqualified_name,
"pm_resume") == 0) {
1207 if (ocs_strcmp(unqualified_name,
"gen_saved_ddump") == 0) {
1211 if (ocs_strcmp(unqualified_name,
"lancer_temp") == 0) {
1214 ocs_log_err(ocs,
"Failed to read temperature\n");
1227 ocs_log_info(NULL,
" Module parameters:\n");
1228 ocs_log_info(NULL,
" Initiator = %d\n", initiator);
1229 ocs_log_info(NULL,
" Target = %d\n", target);
1230 ocs_log_info(NULL,
" ctrlmask = 0x%04x\n", ctrlmask);
1231 ocs_log_info(NULL,
" loglevel = %d\n", loglevel);
1232 ocs_log_info(NULL,
" logmask = 0x%04x\n", logmask);
1233 ocs_log_info(NULL,
" ramlog_size = %d\n", ramlog_size);
1234 ocs_log_info(NULL,
" rq_threads = %d\n", rq_threads);
1235 ocs_log_info(NULL,
" wwn_bump = %s\n", wwn_bump);
1236 ocs_log_info(NULL,
" topology = %d\n", topology);
1237 ocs_log_info(NULL,
" speed = %d\n", speed);
1238 ocs_log_info(NULL,
" holdoff_link_online = %d\n", holdoff_link_online);
1239 ocs_log_info(NULL,
" enable_hlm = %d\n", enable_hlm);
1240 ocs_log_info(NULL,
" hlm_group_size = %d\n", hlm_group_size);
1241 ocs_log_info(NULL,
" max_remote_nodes = %d\n", max_remote_nodes);
1242 ocs_log_info(NULL,
" ethernet_license = %d\n", ethernet_license);
1243 ocs_log_info(NULL,
" num_scsi_ios = %d\n", num_scsi_ios);
1244 ocs_log_info(NULL,
" dif_separate = %d\n", dif_separate);
1245 ocs_log_info(NULL,
" tow_feature = %d\n", tow_feature);
1246 ocs_log_info(NULL,
" tow_io_size = %d\n", tow_io_size);
1247 ocs_log_info(NULL,
" tow_xri_cnt = %d\n", tow_xri_cnt);
1248 ocs_log_info(NULL,
" queue_topology = %s\n", queue_topology);
1249 ocs_log_info(NULL,
" rq_selection_policy = %d\n", rq_selection_policy);
1250 ocs_log_info(NULL,
" rr_quanta = %d\n", rr_quanta);
1251 ocs_log_info(NULL,
" filter_ref = %s\n", filter_def);
1252 ocs_log_info(NULL,
" cq_process_limit = %d\n", cq_process_limit);
1253 ocs_log_info(NULL,
" explicit_buffer_list = %d\n", explicit_buffer_list);
1254 ocs_log_info(NULL,
" external_loopback = %d\n", external_loopback);
1255 ocs_log_info(NULL,
" target_io_timer = %d\n", target_io_timer);
1256 ocs_log_info(NULL,
" target_wqe_timer = %d\n", target_wqe_timer);
1257 ocs_log_info(NULL,
" ddump_saved_size = %d\n", ddump_saved_size);
1258 ocs_log_info(NULL,
" hal_war_version = %s\n", hal_war_version);
1259 ocs_log_info(NULL,
" hw_cmpl_context = %d\n", hw_cmpl_context);
1260 ocs_log_info(NULL,
" watchdog_timeout = %d\n", watchdog_timeout);
1261 ocs_log_info(NULL,
" heartbeat_cpu_mask = 0x%lx\n", heartbeat_cpu_mask);
1262 ocs_log_info(NULL,
" sliport_healthcheck = %d\n", sliport_healthcheck);
1263 ocs_log_info(NULL,
" disable_fec = %d\n", disable_fec);
1264 ocs_log_info(NULL,
" enable_dpp = %d\n", enable_dpp);
1265 ocs_log_info(NULL,
" sliport_pause_errors = %s\n", sliport_pause_errors);
1266 ocs_log_info(NULL,
" enable_bbcr = %d\n", enable_bbcr);
1267 ocs_log_info(NULL,
" fw_dump_type = %d\n", fw_dump_type);
1268 ocs_log_info(NULL,
" enable_auto_recovery = %d\n", enable_auto_recovery);
1269 ocs_log_info(NULL,
" cfg_suppress_rsp = %d\n", cfg_suppress_rsp);
1270 #if defined(OCS_DISC_SPIN_DELAY)
1271 ocs_log_info(NULL,
" disk_spin_delay = %d\n", disk_spin_delay);
1274 #if defined(OCS_INCLUDE_RAMD)
1275 ocs_log_info(NULL,
" num_vports = %d\n", num_vports);
1276 ocs_log_info(NULL,
" p_type = %d\n", p_type);
1277 ocs_log_info(NULL,
" ramdisc_size = %s\n", ramdisc_size);
1278 ocs_log_info(NULL,
" ramdisc_blocksize = %d\n", ramdisc_blocksize);
1279 ocs_log_info(NULL,
" num_luns = %d\n", num_luns);
1280 ocs_log_info(NULL,
" global_ramdisc = %d\n", global_ramdisc);
1281 ocs_log_info(NULL,
" stub_res6_rel6 = %d\n", stub_res6_rel6);
1282 ocs_log_info(NULL,
" ramd_threading = %d\n", ramd_threading);
1283 ocs_log_info(NULL,
" thread_cmds = %d\n",
thread_cmds);
1284 ocs_log_info(NULL,
" external_dif = %s\n", external_dif);
1285 ocs_log_info(NULL,
" esoc = %d\n", esoc);
1296 ocs_log_err(ocs,
"failed to set trunk mode\n");
1298 ocs_log_debug(ocs,
"Trunk mode been set successfully\n");
1310 ocs_log_err(ocs,
"failed to get trunk info\n");
1312 ocs_log_debug(ocs,
"Trunk info obtained successfully\n");
1323 ocs_log_debug(ocs,
"Setting port to internal loopback mode\n");
1325 ocs_log_debug(ocs,
"Setting port to external loopback mode\n");
1327 ocs_log_debug(ocs,
"Unsupported loopback mode: %d\n", loopback_mode);
1329 goto exit_set_loopback_mode;
1332 ocs->external_loopback = 1;
1335 ocs_log_err(ocs,
"failed to set loopback mode\n");
1337 ocs_log_debug(ocs,
"Loopback mode been set successfully\n");
1340 exit_set_loopback_mode:
1347 ocs_node_t *node = NULL;
1349 void *tx_buf = NULL;
1350 void *rx_buf = NULL;
1351 ocs_io_t *els = NULL;
1353 if ((user_tx_buflen == 0) || (rx_buf_len == 0) || (user_tx_buflen != rx_buf_len)) {
1354 ocs_log_test(ocs,
"Error: loopback tx/rx buffer length is invalid\n");
1356 goto free_and_return;
1359 if (!user_tx_buf || !user_rx_buf) {
1360 ocs_log_test(ocs,
"Error: loopback either tx data or rx buffer not provided\n");
1362 goto free_and_return;
1365 tx_buf = ocs_malloc(ocs, user_tx_buflen , OCS_M_ZERO | OCS_M_NOWAIT);
1366 if (tx_buf == NULL) {
1367 ocs_log_err(ocs,
"Failed to allocate buffer for TX frame\n");
1369 goto free_and_return;
1372 rx_buf = ocs_malloc(ocs, rx_buf_len , OCS_M_ZERO | OCS_M_NOWAIT);
1373 if (rx_buf == NULL) {
1374 ocs_log_err(ocs,
"Failed to allocate buffer for TX frame\n");
1376 goto free_and_return;
1379 if (ocs_copy_from_user(tx_buf, user_tx_buf, user_tx_buflen)) {
1380 ocs_log_err(ocs,
"Failed to copy user data into TX buf\n");
1382 goto free_and_return;
1390 ocs_log_err(ocs,
"Failed to find node for loopback test\n");
1392 goto free_and_return;
1397 ocs_log_err(ocs,
"loopback els IO submission failed\n");
1399 goto free_and_return;
1403 ocs_log_err(ocs,
"sem failed. loopback frame not received\n");
1404 els->loopback_evt_data.loopback_rx_data = NULL;
1406 goto free_and_return;
1409 if (ocs_copy_to_user(user_rx_buf, rx_buf, rx_buf_len)) {
1410 ocs_log_err(ocs,
"Failed to copy RX data into user buf\n");
1412 goto free_and_return;
1416 ocs->external_loopback = 0;
1418 ocs_free(ocs, tx_buf, user_tx_buflen);
1421 ocs_free(ocs, rx_buf, rx_buf_len);
1424 ocs_ref_put(&els->ref);
1431 void *user_rx_buf, uint32_t user_rx_buf_len)
1434 void *tx_buf = NULL;
1435 void *rx_buf = NULL;
1437 if ((user_tx_buflen == 0) || (user_rx_buf_len == 0) ||
1438 (user_tx_buflen != user_rx_buf_len)) {
1439 ocs_log_test(ocs,
"Error: loopback tx/rx buffer length is invalid\n");
1441 goto free_and_return;
1444 if (!user_tx_buf || !user_rx_buf) {
1445 ocs_log_test(ocs,
"Error: loopback either tx data or rx buffer not provided\n");
1447 goto free_and_return;
1450 tx_buf = ocs_malloc(ocs, user_tx_buflen , OCS_M_ZERO | OCS_M_NOWAIT);
1451 if (tx_buf == NULL) {
1452 ocs_log_err(ocs,
"Failed to allocate buffer for TX frame\n");
1454 goto free_and_return;
1457 rx_buf = ocs_malloc(ocs, user_rx_buf_len , OCS_M_ZERO | OCS_M_NOWAIT);
1458 if (rx_buf == NULL) {
1459 ocs_log_err(ocs,
"Failed to allocate buffer for TX frame\n");
1461 goto free_and_return;
1464 if (ocs_copy_from_user(tx_buf, user_tx_buf, user_tx_buflen)) {
1465 ocs_log_err(ocs,
"Failed to copy user data into TX buf\n");
1467 goto free_and_return;
1471 rx_buf, user_rx_buf_len);
1473 ocs_log_err(ocs,
"BIU DIAG MBOX command is failed\n");
1474 goto free_and_return;
1477 if (ocs_copy_to_user(user_rx_buf, rx_buf, user_rx_buf_len)) {
1478 ocs_log_err(ocs,
"Failed to copy RX data into user buf\n");
1480 goto free_and_return;
1485 ocs_free(ocs, tx_buf, user_tx_buflen);
1488 ocs_free(ocs, rx_buf, user_rx_buf_len);
1497 void *rx_buf = NULL;
1500 if (!rx_buf_len || !user_rx_buf) {
1501 ocs_log_err(ocs,
"Error: tx/rx buffer is invalid\n");
1505 buf_len = rx_buf_len;
1507 rx_buf = ocs_vmalloc(ocs, buf_len, OCS_M_ZERO);
1508 if (rx_buf == NULL) {
1509 ocs_log_err(ocs,
"unable to allocate memory\n");
1513 buf_len =
ocs_ras_copy_logs(ocs, rx_buf +
sizeof(uint32_t), buf_len -
sizeof(uint32_t));
1514 *((uint32_t *)rx_buf) = buf_len;
1516 if (ocs_copy_to_user(user_rx_buf, rx_buf, buf_len +
sizeof(uint32_t))) {
1517 ocs_log_err(ocs,
"Failed to copy buffer for fw diag log\n");
1526 ocs_vfree(ocs, rx_buf, rx_buf_len);
const char * ocs_pm_get_state_string(ocs_t *ocs)
Return driver power state as an ascii string.
uint32_t ocs_instance(void *os)
Return instance index of an opaque ocs structure.
static void ocs_driver_print_module_params(void)
static void ocs_device_interrupt_handler(ocs_t *ocs, uint32_t vector)
interrupt handler
#define OCS_HAL_OBJECT_G5
int ocs_run_link_loopback(ocs_t *ocs, void *tx_buf, uint32_t tx_buflen, void *rx_buf, uint32_t rx_buflen)
int32_t ocs_scsi_tgt_driver_init(void)
Driver-wide initialization for the target-server.
static void ocs_capture_hal_global_params(void)
int ocs_ras_copy_logs(ocs_t *ocs, void *user_buf, int32_t user_buf_len)
void ocs_device_shutdown(void)
Perform driver wide shutdown actions.
int32_t ocs_scsi_ini_driver_init(int32_t initiator)
Initialize initiator client.
#define LOOPBACK_FRAME_TIMEOUT_SEC
int32_t ocs_device_interrupts_required(ocs_t *ocs)
return the number of interrupts required per HBA
int ocs_set_loopback_mode(ocs_t *ocs, uint32_t arg_in)
void ocs_mgmt_emit_int(ocs_textbuf_t *textbuf, int mode, const char *name, const char *fmt,...)
Generate a property with an integer value in a management XML document.
int32_t ocs_scsi_tgt_driver_exit(void)
Driver-wide clean-up for the target-server.
uint64_t g_app_watchdog_cpu_mask
uint32_t ocs_hal_qtop_eq_count(ocs_hal_t *hal)
Return count of EQs for a queue topology object.
void ocs_hal_free_dump_to_host_buffers(ocs_hal_t *hal)
ocs_hal_global_t hal_global
void ocs_mgmt_driver_get_all(ocs_textbuf_t *textbuf, void *driver)
void ocs_xport_config_stats_timer(void *arg)
Get FC link and host Statistics periodically.
void ocs_device_free(ocs_t *ocs)
free ocs device
static void ocs_device_lock_init(ocs_t *ocs)
void ocs_fw_err_recovery_stop(void)
Stop FW error recovery thread.
#define SLI4_MBOX_EXT_STATUS_OBJ_UNSUPPORTED_FIRMWARE
uint32_t fw_diag_log_size
static ocs_mgmt_functions_t driver_mgmt_functions
int32_t ocs_xport_detach(ocs_xport_t *xport)
Detaches the transport from the device.
ocs_hal_rtn_e ocs_hal_set_loopback_mode(ocs_hal_t *hal, uint32_t type)
Set the Lancer dump location.
void ocs_fw_dump_init(ocs_t *ocs, int32_t fw_dump_type)
Initialize fw dump context.
static void ocs_device_lock_free(ocs_t *ocs)
static uint32_t thread_cmds
int32_t ocs_device_detach(ocs_t *ocs)
free resources when pci device detach
int ocs_mgmt_driver_exec(char *parent, char *action, void *arg_in, uint32_t arg_in_length, void *arg_out, uint32_t arg_out_length, void *driver)
ocs_node_t * ocs_node_find(ocs_sport_t *sport, uint32_t port_id)
Find an FC node structure given the FC port ID.
void ocs_mgmt_start_unnumbered_section(ocs_textbuf_t *textbuf, const char *name)
Generate the beginning of an unnumbered section in a management XML document.
int32_t ocs_xport_attach(ocs_xport_t *xport)
Do as much allocation as possible, but do not initialization the device.
int32_t ocs_save_ddump(ocs_t *ocs, uint32_t flags, uint32_t qentries)
Capture and save ddump.
uint32_t fw_diag_log_level
void ocs_textbuf_free(ocs_t *ocs, ocs_textbuf_t *textbuf)
int const char const char void ocs_mgmt_emit_boolean(ocs_textbuf_t *textbuf, int access, const char *name, const int value)
Generate a property with a boolean value in a management XML document.
int ocs_ras_collect_diag_logs(ocs_t *ocs, void *user_tx_buf, uint32_t user_tx_buflen, void *user_rx_buf, uint32_t rx_buf_len)
int ocs_request_firmware_update(ocs_t *ocs)
int ocs_firmware_write(ocs_t *ocs, const u8 *buf, size_t buf_len, uint8_t *change_status)
#define OCS_RAS_LOGICAL_BUFFER_SIZE_MIN
void ocs_ramlog_free(ocs_t *ocs, ocs_ramlog_t *ramlog)
Free a ramlog buffer.
int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd,...)
Perform transport attach function.
#define ocs_list_init(head, type, link)
int32_t ocs_device_init_complete(void)
Perform device initialization complete.
int32_t ocs_fw_err_recovery_setup(void)
Create a FW error recovery thread.
static ocs_t * ocs_devices[MAX_OCS_DEVICES]
int32_t ocs_start_event_processing(ocs_os_t *ocs_os)
#define OCS_RAS_LOGICAL_BUFFER_SIZE_MAX
#define INTERNAL_LOOPBACK
int32_t ocs_pm_request(ocs_t *ocs, ocs_pm_msg_e msg, int32_t(*callback)(ocs_t *ocs, int32_t status, void *arg), void *arg)
Handle Power Management Request.
int ocs_run_pci_loopback(ocs_t *ocs, void *tx_buf, uint32_t tx_buflen, void *rx_buf, uint32_t rx_buflen)
void ocs_mgmt_end_unnumbered_section(ocs_textbuf_t *textbuf, const char *name)
Generate the end of a section in a management XML document.
int32_t ocs_device_attach(ocs_t *ocs)
Initialize resources when pci devices attach.
int32_t ocs_scsi_host_ml_registered(ocs_t *ocs)
const char * ocs_display_name(void *os)
return OCS instance display name
int32_t ocs_xport_initialize(ocs_xport_t *xport)
Initializes the device.
ocs_t * ocs_get_instance(uint32_t index)
return pointer to ocs structure given instance index
#define OCS_RAS_FW_LOG_LEVEL_MAX
ocs_mgmt_get_list_handler get_list_handler
#define FW_DUMP_TYPE_DUMPTOHOST
#define FW_FUNC_DESC_DUMP
#define EXTERNAL_LOOPBACK
int32_t ocs_fw_reset(ocs_t *ocs)
const char * queue_topology_string
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.
int32_t ocs_scsi_ini_driver_exit(int32_t initiator)
initiator client exit
#define FW_CHIP_LEVEL_DUMP
int ocs_mgmt_driver_get(ocs_textbuf_t *textbuf, char *parent, char *name, void *driver)
#define OCS_RAMLOG_DEFAULT_BUFFERS
void ocs_mgmt_driver_list(ocs_textbuf_t *textbuf, void *driver)
ocs_io_t * ocs_ns_send_loopback_frame(ocs_node_t *node, void *buf, uint32_t size, void *rx_buf, uint32_t rx_buf_size, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
int ocs_set_fc_trunk_mode(ocs_t *ocs, uint32_t trunk_mode)
int32_t ocs_read_temperature_lancer(ocs_t *ocs, void *buf, uint32_t buf_len)
ocs_hal_rtn_e ocs_hal_get_trunk_info(ocs_hal_t *hal, uint32_t *trunk_info)
Get trunking mode information.
int32_t ocs_gendump(ocs_t *ocs, uint8_t dump_level)
int32_t ocs_hal_process(ocs_hal_t *hal, uint32_t vector, uint32_t max_isr_time_msec)
void ocs_stop_event_processing(ocs_os_t *ocs_os)
ocs_xport_t * ocs_xport_alloc(ocs_t *ocs)
Allocate a transport object.
PARAM_LIST int32_t ocs_device_init(void)
void ocs_xport_free(ocs_xport_t *xport)
Free a transport object.
void * ocs_device_alloc(uint32_t nid)
int32_t ocs_get_property(const char *prop_name, char *buffer, uint32_t buffer_len)
get driver wide property value
ocs_hal_rtn_e ocs_hal_setup(ocs_hal_t *hal, ocs_os_handle_t os, sli4_port_type_e port_type)
Set up the Hardware Abstraction Layer module.
#define ocs_assert(cond,...)
ocs_hal_rtn_e ocs_hal_run_biu_diag(ocs_hal_t *hal, void *tx_buff, size_t tx_buff_len, void *rx_buff, size_t rx_buff_len)
Run Diagnostic PCI Loopback test.
ocs_hal_rtn_e ocs_hal_clear_dump_location(ocs_hal_t *hal)
Clear the Lancer dump location.
int32_t ocs_textbuf_alloc(ocs_t *ocs, ocs_textbuf_t *textbuf, uint32_t length)
int ocs_get_fc_trunk_info(ocs_t *ocs, uint32_t *trunk_config)
void * ocs_hal_get_ptr(ocs_hal_t *hal, ocs_hal_property_e prop)
static void ocs_fw_write_cb(int32_t status, int32_t ext_status, uint32_t actual_write_length, uint32_t change_status, void *arg)
int32_t ocs_xport_status(ocs_xport_t *xport, ocs_xport_status_e cmd, ocs_xport_stats_t *result)
Return status on a link.
void ocs_mgmt_emit_string(ocs_textbuf_t *textbuf, int access, const char *name, const char *value)
Generate a property with a string value in a management XML document.
void ocs_ramlog_clear(ocs_t *ocs, ocs_ramlog_t *ramlog, int clear_start_of_day, int clear_recent)
Clear a ramlog buffer.
#define ocs_list_foreach(list, item)
Iterate a linked list.
ocs_ramlog_t * ocs_ramlog_init(ocs_t *ocs, uint32_t buffer_len, uint32_t buffer_count)
Allocate a ramlog buffer.
#define OCS_HAL_OBJECT_G6
void ocs_mgmt_emit_property_name(ocs_textbuf_t *textbuf, int access, const char *name)
Generate a property, with no value, in a management XML document.
void ocs_device_shutdown_complete(void)
Perform driver wide shutdown complete actions.
ocs_hal_rtn_e ocs_hal_set_trunk_mode(ocs_hal_t *hal, uint32_t trunk_mode)
Set trunking mode.
#define FW_DUMP_TYPE_FLASH
ocs_hal_rtn_e ocs_hal_firmware_write(ocs_hal_t *hal, ocs_dma_t *dma, uint32_t size, uint32_t offset, int last, ocs_hal_fw_cb_t cb, void *arg)
Write a portion of a firmware image to the device.