Lines Matching refs:instance
51 extern void megasas_free_cmds(struct megasas_instance *instance);
53 *instance);
55 megasas_complete_cmd(struct megasas_instance *instance,
58 wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd,
62 megasas_return_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd);
63 int megasas_alloc_cmds(struct megasas_instance *instance);
65 megasas_clear_intr_fusion(struct megasas_instance *instance);
67 megasas_issue_polled(struct megasas_instance *instance,
70 megasas_check_and_restore_queue_depth(struct megasas_instance *instance);
72 int megasas_transition_to_ready(struct megasas_instance *instance, int ocr);
73 void megaraid_sas_kill_hba(struct megasas_instance *instance);
76 int megasas_sriov_start_heartbeat(struct megasas_instance *instance,
78 void megasas_start_timer(struct megasas_instance *instance);
82 static void megasas_free_rdpq_fusion(struct megasas_instance *instance);
83 static void megasas_free_reply_fusion(struct megasas_instance *instance);
85 void megasas_configure_queue_sizes(struct megasas_instance *instance);
86 static void megasas_fusion_crash_dump(struct megasas_instance *instance);
87 extern u32 megasas_readl(struct megasas_instance *instance,
103 megasas_adp_reset_wait_for_ready(struct megasas_instance *instance, in megasas_adp_reset_wait_for_ready() argument
114 dev_info(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
118 pci_cfg_access_lock(instance->pdev); in megasas_adp_reset_wait_for_ready()
121 if (instance->instancet->adp_reset in megasas_adp_reset_wait_for_ready()
122 (instance, instance->reg_set)) in megasas_adp_reset_wait_for_ready()
127 if (megasas_transition_to_ready(instance, ocr_context)) { in megasas_adp_reset_wait_for_ready()
128 dev_warn(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
130 instance->host->host_no); in megasas_adp_reset_wait_for_ready()
137 dev_info(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
141 pci_cfg_access_unlock(instance->pdev); in megasas_adp_reset_wait_for_ready()
158 (struct megasas_instance *instance, dma_addr_t start_addr, size_t size) in megasas_check_same_4gb_region() argument
165 dev_err(&instance->pdev->dev, in megasas_check_same_4gb_region()
180 megasas_enable_intr_fusion(struct megasas_instance *instance) in megasas_enable_intr_fusion() argument
183 regs = instance->reg_set; in megasas_enable_intr_fusion()
185 instance->mask_interrupts = 0; in megasas_enable_intr_fusion()
193 dev_info(&instance->pdev->dev, "%s is called outbound_intr_mask:0x%08x\n", in megasas_enable_intr_fusion()
202 megasas_disable_intr_fusion(struct megasas_instance *instance) in megasas_disable_intr_fusion() argument
206 regs = instance->reg_set; in megasas_disable_intr_fusion()
207 instance->mask_interrupts = 1; in megasas_disable_intr_fusion()
211 dev_info(&instance->pdev->dev, "%s is called outbound_intr_mask:0x%08x\n", in megasas_disable_intr_fusion()
216 megasas_clear_intr_fusion(struct megasas_instance *instance) in megasas_clear_intr_fusion() argument
220 regs = instance->reg_set; in megasas_clear_intr_fusion()
224 status = megasas_readl(instance, in megasas_clear_intr_fusion()
245 *instance, u32 blk_tag) in megasas_get_cmd_fusion()
249 fusion = instance->ctrl_context; in megasas_get_cmd_fusion()
258 inline void megasas_return_cmd_fusion(struct megasas_instance *instance, in megasas_return_cmd_fusion() argument
273 megasas_write_64bit_req_desc(struct megasas_instance *instance, in megasas_write_64bit_req_desc() argument
279 writeq(req_data, &instance->reg_set->inbound_low_queue_port); in megasas_write_64bit_req_desc()
282 spin_lock_irqsave(&instance->hba_lock, flags); in megasas_write_64bit_req_desc()
284 &instance->reg_set->inbound_low_queue_port); in megasas_write_64bit_req_desc()
286 &instance->reg_set->inbound_high_queue_port); in megasas_write_64bit_req_desc()
287 spin_unlock_irqrestore(&instance->hba_lock, flags); in megasas_write_64bit_req_desc()
300 megasas_fire_cmd_fusion(struct megasas_instance *instance, in megasas_fire_cmd_fusion() argument
303 if (instance->atomic_desc_support) in megasas_fire_cmd_fusion()
305 &instance->reg_set->inbound_single_queue_port); in megasas_fire_cmd_fusion()
307 megasas_write_64bit_req_desc(instance, req_desc); in megasas_fire_cmd_fusion()
322 megasas_fusion_update_can_queue(struct megasas_instance *instance, int fw_boot_context) in megasas_fusion_update_can_queue() argument
328 if (instance->adapter_type < VENTURA_SERIES) in megasas_fusion_update_can_queue()
330 megasas_readl(instance, in megasas_fusion_update_can_queue()
331 &instance->reg_set->outbound_scratch_pad_2) & 0x00FFFF; in megasas_fusion_update_can_queue()
334 cur_max_fw_cmds = instance->instancet->read_fw_status_reg(instance) & 0x00FFFF; in megasas_fusion_update_can_queue()
337 (instance->instancet->read_fw_status_reg(instance) & 0x00FFFF) - MEGASAS_FUSION_IOCTL_CMDS; in megasas_fusion_update_can_queue()
339 dev_info(&instance->pdev->dev, in megasas_fusion_update_can_queue()
345 if (cur_max_fw_cmds < instance->max_fw_cmds) { in megasas_fusion_update_can_queue()
346 instance->cur_can_queue = in megasas_fusion_update_can_queue()
349 instance->host->can_queue = instance->cur_can_queue; in megasas_fusion_update_can_queue()
350 instance->ldio_threshold = ldio_threshold; in megasas_fusion_update_can_queue()
353 instance->max_fw_cmds = cur_max_fw_cmds; in megasas_fusion_update_can_queue()
354 instance->ldio_threshold = ldio_threshold; in megasas_fusion_update_can_queue()
357 instance->max_fw_cmds = min(instance->max_fw_cmds, in megasas_fusion_update_can_queue()
364 instance->max_fw_cmds = instance->max_fw_cmds-1; in megasas_fusion_update_can_queue()
372 megasas_free_cmds_fusion(struct megasas_instance *instance) in megasas_free_cmds_fusion() argument
375 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_cmds_fusion()
384 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_free_cmds_fusion()
408 if (instance->is_rdpq) in megasas_free_cmds_fusion()
409 megasas_free_rdpq_fusion(instance); in megasas_free_cmds_fusion()
411 megasas_free_reply_fusion(instance); in megasas_free_cmds_fusion()
415 dma_free_coherent(&instance->pdev->dev, in megasas_free_cmds_fusion()
433 static int megasas_create_sg_sense_fusion(struct megasas_instance *instance) in megasas_create_sg_sense_fusion() argument
442 fusion = instance->ctrl_context; in megasas_create_sg_sense_fusion()
443 max_cmd = instance->max_fw_cmds; in megasas_create_sg_sense_fusion()
444 sense_sz = instance->max_mpt_cmds * SCSI_SENSE_BUFFERSIZE; in megasas_create_sg_sense_fusion()
447 dma_pool_create("mr_sg", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
448 instance->max_chain_frame_sz, in megasas_create_sg_sense_fusion()
452 dma_pool_create("mr_sense", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
456 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
464 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
480 if (!megasas_check_same_4gb_region(instance, fusion->sense_phys_addr, in megasas_create_sg_sense_fusion()
488 dma_pool_create("mr_sense_align", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
492 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
500 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
519 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
526 for (i = max_cmd; i < instance->max_mpt_cmds; i++) { in megasas_create_sg_sense_fusion()
538 megasas_alloc_cmdlist_fusion(struct megasas_instance *instance) in megasas_alloc_cmdlist_fusion() argument
543 fusion = instance->ctrl_context; in megasas_alloc_cmdlist_fusion()
545 max_mpt_cmd = instance->max_mpt_cmds; in megasas_alloc_cmdlist_fusion()
556 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
568 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
578 megasas_alloc_request_fusion(struct megasas_instance *instance) in megasas_alloc_request_fusion() argument
582 fusion = instance->ctrl_context; in megasas_alloc_request_fusion()
586 dma_pool_create("mr_ioreq", &instance->pdev->dev, in megasas_alloc_request_fusion()
590 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
599 if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) { in megasas_alloc_request_fusion()
600 instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT; in megasas_alloc_request_fusion()
602 megasas_configure_queue_sizes(instance); in megasas_alloc_request_fusion()
605 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
611 if (!megasas_check_same_4gb_region(instance, in megasas_alloc_request_fusion()
622 &instance->pdev->dev, in megasas_alloc_request_fusion()
628 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
639 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
646 dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_request_fusion()
650 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
659 megasas_alloc_reply_fusion(struct megasas_instance *instance) in megasas_alloc_reply_fusion() argument
664 fusion = instance->ctrl_context; in megasas_alloc_reply_fusion()
666 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_alloc_reply_fusion()
668 dma_pool_create("mr_reply", &instance->pdev->dev, in megasas_alloc_reply_fusion()
672 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
681 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
686 if (!megasas_check_same_4gb_region(instance, in megasas_alloc_reply_fusion()
697 &instance->pdev->dev, in megasas_alloc_reply_fusion()
703 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
714 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
736 megasas_alloc_rdpq_fusion(struct megasas_instance *instance) in megasas_alloc_rdpq_fusion() argument
746 fusion = instance->ctrl_context; in megasas_alloc_rdpq_fusion()
751 fusion->rdpq_virt = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
755 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
760 msix_count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_alloc_rdpq_fusion()
763 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
767 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
774 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
794 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
810 if (!megasas_check_same_4gb_region(instance, rdpq_chunk_phys[i], in megasas_alloc_rdpq_fusion()
820 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
860 megasas_free_rdpq_fusion(struct megasas_instance *instance) { in megasas_free_rdpq_fusion() argument
865 fusion = instance->ctrl_context; in megasas_free_rdpq_fusion()
879 dma_free_coherent(&instance->pdev->dev, in megasas_free_rdpq_fusion()
885 megasas_free_reply_fusion(struct megasas_instance *instance) { in megasas_free_reply_fusion() argument
889 fusion = instance->ctrl_context; in megasas_free_reply_fusion()
918 megasas_alloc_cmds_fusion(struct megasas_instance *instance) in megasas_alloc_cmds_fusion() argument
928 fusion = instance->ctrl_context; in megasas_alloc_cmds_fusion()
930 if (megasas_alloc_request_fusion(instance)) in megasas_alloc_cmds_fusion()
933 if (instance->is_rdpq) { in megasas_alloc_cmds_fusion()
934 if (megasas_alloc_rdpq_fusion(instance)) in megasas_alloc_cmds_fusion()
937 if (megasas_alloc_reply_fusion(instance)) in megasas_alloc_cmds_fusion()
940 if (megasas_alloc_cmdlist_fusion(instance)) in megasas_alloc_cmds_fusion()
943 dev_info(&instance->pdev->dev, "Configured max firmware commands: %d\n", in megasas_alloc_cmds_fusion()
944 instance->max_fw_cmds); in megasas_alloc_cmds_fusion()
955 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_alloc_cmds_fusion()
962 (i >= instance->max_scsi_cmds && i < instance->max_fw_cmds) ? in megasas_alloc_cmds_fusion()
963 (i - instance->max_scsi_cmds) : in megasas_alloc_cmds_fusion()
965 cmd->instance = instance; in megasas_alloc_cmds_fusion()
975 if (megasas_create_sg_sense_fusion(instance)) in megasas_alloc_cmds_fusion()
981 megasas_free_cmds_fusion(instance); in megasas_alloc_cmds_fusion()
993 wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd, in wait_and_poll() argument
1009 status_reg = instance->instancet->read_fw_status_reg(instance) in wait_and_poll()
1031 megasas_ioc_init_fusion(struct megasas_instance *instance) in megasas_ioc_init_fusion() argument
1049 fusion = instance->ctrl_context; in megasas_ioc_init_fusion()
1057 (instance, &instance->reg_set->outbound_scratch_pad_1); in megasas_ioc_init_fusion()
1061 if (instance->adapter_type == INVADER_SERIES) { in megasas_ioc_init_fusion()
1065 if (instance->consistent_mask_64bit && !cur_fw_64bit_dma_capable) { in megasas_ioc_init_fusion()
1066 dev_err(&instance->pdev->dev, "Driver was operating on 64bit " in megasas_ioc_init_fusion()
1068 megaraid_sas_kill_hba(instance); in megasas_ioc_init_fusion()
1074 if (instance->is_rdpq && !cur_rdpq_mode) { in megasas_ioc_init_fusion()
1075 dev_err(&instance->pdev->dev, "Firmware downgrade *NOT SUPPORTED*" in megasas_ioc_init_fusion()
1084 if ((instance->low_latency_index_start == in megasas_ioc_init_fusion()
1086 instance->perf_mode = MR_BALANCED_PERF_MODE; in megasas_ioc_init_fusion()
1088 dev_info(&instance->pdev->dev, "Performance mode :%s\n", in megasas_ioc_init_fusion()
1089 MEGASAS_PERF_MODE_2STR(instance->perf_mode)); in megasas_ioc_init_fusion()
1091 instance->fw_sync_cache_support = (scratch_pad_1 & in megasas_ioc_init_fusion()
1093 dev_info(&instance->pdev->dev, "FW supports sync cache\t: %s\n", in megasas_ioc_init_fusion()
1094 instance->fw_sync_cache_support ? "Yes" : "No"); in megasas_ioc_init_fusion()
1105 IOCInitMessage->ReplyDescriptorPostQueueAddress = instance->is_rdpq ? in megasas_ioc_init_fusion()
1108 IOCInitMessage->MsgFlags = instance->is_rdpq ? in megasas_ioc_init_fusion()
1112 IOCInitMessage->HostMSIxVectors = instance->msix_vectors; in megasas_ioc_init_fusion()
1132 if (instance->adapter_type >= INVADER_SERIES) in megasas_ioc_init_fusion()
1141 if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN) in megasas_ioc_init_fusion()
1153 if (instance->consistent_mask_64bit) in megasas_ioc_init_fusion()
1160 if (instance->system_info_buf && sys_info) { in megasas_ioc_init_fusion()
1161 memcpy(instance->system_info_buf->systemId, sys_info, in megasas_ioc_init_fusion()
1163 instance->system_info_buf->systemIdLength = in megasas_ioc_init_fusion()
1165 init_frame->system_info_lo = cpu_to_le32(lower_32_bits(instance->system_info_h)); in megasas_ioc_init_fusion()
1166 init_frame->system_info_hi = cpu_to_le32(upper_32_bits(instance->system_info_h)); in megasas_ioc_init_fusion()
1179 switch (instance->perf_mode) { in megasas_ioc_init_fusion()
1182 cpu_to_le16(~(~0 << instance->low_latency_index_start/8)); in megasas_ioc_init_fusion()
1186 cpu_to_le16(~(~0 << instance->msix_vectors/8)); in megasas_ioc_init_fusion()
1200 instance->instancet->disable_intr(instance); in megasas_ioc_init_fusion()
1203 if (megasas_readl(instance, &instance->reg_set->doorbell) & 1) in megasas_ioc_init_fusion()
1210 megasas_write_64bit_req_desc(instance, &req_desc); in megasas_ioc_init_fusion()
1212 wait_and_poll(instance, cmd, MFI_IO_TIMEOUT_SECS); in megasas_ioc_init_fusion()
1220 if (instance->adapter_type >= AERO_SERIES) { in megasas_ioc_init_fusion()
1222 (instance, &instance->reg_set->outbound_scratch_pad_1); in megasas_ioc_init_fusion()
1224 instance->atomic_desc_support = in megasas_ioc_init_fusion()
1227 dev_info(&instance->pdev->dev, "FW supports atomic descriptor\t: %s\n", in megasas_ioc_init_fusion()
1228 instance->atomic_desc_support ? "Yes" : "No"); in megasas_ioc_init_fusion()
1234 dev_err(&instance->pdev->dev, in megasas_ioc_init_fusion()
1236 instance->host->host_no); in megasas_ioc_init_fusion()
1251 megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend) { in megasas_sync_pd_seq_num() argument
1256 struct fusion_context *fusion = instance->ctrl_context; in megasas_sync_pd_seq_num()
1260 pd_sync = (void *)fusion->pd_seq_sync[(instance->pd_seq_map_id & 1)]; in megasas_sync_pd_seq_num()
1261 pd_seq_h = fusion->pd_seq_phys[(instance->pd_seq_map_id & 1)]; in megasas_sync_pd_seq_num()
1264 cmd = megasas_get_cmd(instance); in megasas_sync_pd_seq_num()
1266 dev_err(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1280 instance->jbod_seq_cmd = cmd; in megasas_sync_pd_seq_num()
1293 megasas_set_dma_settings(instance, dcmd, pd_seq_h, pd_seq_map_sz); in megasas_sync_pd_seq_num()
1296 instance->instancet->issue_dcmd(instance, cmd); in megasas_sync_pd_seq_num()
1301 if (!instance->mask_interrupts) in megasas_sync_pd_seq_num()
1302 ret = megasas_issue_blocked_cmd(instance, cmd, in megasas_sync_pd_seq_num()
1305 ret = megasas_issue_polled(instance, cmd); in megasas_sync_pd_seq_num()
1308 dev_warn(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1315 megaraid_sas_kill_hba(instance); in megasas_sync_pd_seq_num()
1318 instance->pd_seq_map_id++; in megasas_sync_pd_seq_num()
1320 megasas_return_cmd(instance, cmd); in megasas_sync_pd_seq_num()
1340 megasas_get_ld_map_info(struct megasas_instance *instance) in megasas_get_ld_map_info() argument
1350 cmd = megasas_get_cmd(instance); in megasas_get_ld_map_info()
1353 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for map info\n"); in megasas_get_ld_map_info()
1357 fusion = instance->ctrl_context; in megasas_get_ld_map_info()
1360 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1368 ci = (void *) fusion->ld_map[(instance->map_id & 1)]; in megasas_get_ld_map_info()
1369 ci_h = fusion->ld_map_phys[(instance->map_id & 1)]; in megasas_get_ld_map_info()
1372 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to alloc mem for ld_map_info\n"); in megasas_get_ld_map_info()
1373 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1388 megasas_set_dma_settings(instance, dcmd, ci_h, size_map_info); in megasas_get_ld_map_info()
1390 if (!instance->mask_interrupts) in megasas_get_ld_map_info()
1391 ret = megasas_issue_blocked_cmd(instance, cmd, in megasas_get_ld_map_info()
1394 ret = megasas_issue_polled(instance, cmd); in megasas_get_ld_map_info()
1397 megaraid_sas_kill_hba(instance); in megasas_get_ld_map_info()
1399 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1405 megasas_get_map_info(struct megasas_instance *instance) in megasas_get_map_info() argument
1407 struct fusion_context *fusion = instance->ctrl_context; in megasas_get_map_info()
1410 if (!megasas_get_ld_map_info(instance)) { in megasas_get_map_info()
1411 if (MR_ValidateMapInfo(instance, instance->map_id)) { in megasas_get_map_info()
1428 megasas_sync_map_info(struct megasas_instance *instance) in megasas_sync_map_info() argument
1442 cmd = megasas_get_cmd(instance); in megasas_sync_map_info()
1445 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for sync info\n"); in megasas_sync_map_info()
1449 fusion = instance->ctrl_context; in megasas_sync_map_info()
1452 megasas_return_cmd(instance, cmd); in megasas_sync_map_info()
1456 map = fusion->ld_drv_map[instance->map_id & 1]; in megasas_sync_map_info()
1465 fusion->ld_map[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1468 ci_h = fusion->ld_map_phys[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1491 megasas_set_dma_settings(instance, dcmd, ci_h, size_map_info); in megasas_sync_map_info()
1493 instance->map_update_cmd = cmd; in megasas_sync_map_info()
1495 instance->instancet->issue_dcmd(instance, cmd); in megasas_sync_map_info()
1507 megasas_display_intel_branding(struct megasas_instance *instance) in megasas_display_intel_branding() argument
1509 if (instance->pdev->subsystem_vendor != PCI_VENDOR_ID_INTEL) in megasas_display_intel_branding()
1512 switch (instance->pdev->device) { in megasas_display_intel_branding()
1514 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1516 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1517 instance->host->host_no, in megasas_display_intel_branding()
1521 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1522 instance->host->host_no, in megasas_display_intel_branding()
1526 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1527 instance->host->host_no, in megasas_display_intel_branding()
1531 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1532 instance->host->host_no, in megasas_display_intel_branding()
1540 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1542 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1543 instance->host->host_no, in megasas_display_intel_branding()
1547 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1548 instance->host->host_no, in megasas_display_intel_branding()
1557 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1559 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1560 instance->host->host_no, in megasas_display_intel_branding()
1579 static inline int megasas_allocate_raid_maps(struct megasas_instance *instance) in megasas_allocate_raid_maps() argument
1584 fusion = instance->ctrl_context; in megasas_allocate_raid_maps()
1599 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1609 fusion->ld_map[i] = dma_alloc_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1614 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1626 dma_free_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1654 void megasas_configure_queue_sizes(struct megasas_instance *instance) in megasas_configure_queue_sizes() argument
1659 fusion = instance->ctrl_context; in megasas_configure_queue_sizes()
1660 max_cmd = instance->max_fw_cmds; in megasas_configure_queue_sizes()
1662 if (instance->adapter_type >= VENTURA_SERIES) in megasas_configure_queue_sizes()
1663 instance->max_mpt_cmds = instance->max_fw_cmds * RAID_1_PEER_CMDS; in megasas_configure_queue_sizes()
1665 instance->max_mpt_cmds = instance->max_fw_cmds; in megasas_configure_queue_sizes()
1667 instance->max_scsi_cmds = instance->max_fw_cmds - instance->max_mfi_cmds; in megasas_configure_queue_sizes()
1668 instance->cur_can_queue = instance->max_scsi_cmds; in megasas_configure_queue_sizes()
1669 instance->host->can_queue = instance->cur_can_queue; in megasas_configure_queue_sizes()
1674 instance->max_mpt_cmds; in megasas_configure_queue_sizes()
1679 * (instance->max_mpt_cmds + 1)); /* Extra 1 for SMID 0 */ in megasas_configure_queue_sizes()
1682 static int megasas_alloc_ioc_init_frame(struct megasas_instance *instance) in megasas_alloc_ioc_init_frame() argument
1687 fusion = instance->ctrl_context; in megasas_alloc_ioc_init_frame()
1692 dev_err(&instance->pdev->dev, "Failed from func: %s line: %d\n", in megasas_alloc_ioc_init_frame()
1697 cmd->frame = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_ioc_init_frame()
1702 dev_err(&instance->pdev->dev, "Failed from func: %s line: %d\n", in megasas_alloc_ioc_init_frame()
1716 static inline void megasas_free_ioc_init_cmd(struct megasas_instance *instance) in megasas_free_ioc_init_cmd() argument
1720 fusion = instance->ctrl_context; in megasas_free_ioc_init_cmd()
1723 dma_free_coherent(&instance->pdev->dev, in megasas_free_ioc_init_cmd()
1738 megasas_init_adapter_fusion(struct megasas_instance *instance) in megasas_init_adapter_fusion() argument
1745 fusion = instance->ctrl_context; in megasas_init_adapter_fusion()
1747 megasas_fusion_update_can_queue(instance, PROBE_CONTEXT); in megasas_init_adapter_fusion()
1752 instance->max_mfi_cmds = in megasas_init_adapter_fusion()
1755 megasas_configure_queue_sizes(instance); in megasas_init_adapter_fusion()
1757 scratch_pad_1 = megasas_readl(instance, in megasas_init_adapter_fusion()
1758 &instance->reg_set->outbound_scratch_pad_1); in megasas_init_adapter_fusion()
1766 instance->max_chain_frame_sz = in megasas_init_adapter_fusion()
1770 instance->max_chain_frame_sz = in megasas_init_adapter_fusion()
1774 if (instance->max_chain_frame_sz < MEGASAS_CHAIN_FRAME_SZ_MIN) { in megasas_init_adapter_fusion()
1775 dev_warn(&instance->pdev->dev, "frame size %d invalid, fall back to legacy max frame size %d\n", in megasas_init_adapter_fusion()
1776 instance->max_chain_frame_sz, in megasas_init_adapter_fusion()
1778 instance->max_chain_frame_sz = MEGASAS_CHAIN_FRAME_SZ_MIN; in megasas_init_adapter_fusion()
1786 instance->max_chain_frame_sz in megasas_init_adapter_fusion()
1789 instance->max_num_sge = in megasas_init_adapter_fusion()
1801 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_init_adapter_fusion()
1809 instance->max_scsi_cmds = instance->max_fw_cmds - in megasas_init_adapter_fusion()
1812 sema_init(&instance->ioctl_sem, MEGASAS_FUSION_IOCTL_CMDS); in megasas_init_adapter_fusion()
1814 if (megasas_alloc_ioc_init_frame(instance)) in megasas_init_adapter_fusion()
1821 if (megasas_alloc_cmds(instance)) in megasas_init_adapter_fusion()
1823 if (megasas_alloc_cmds_fusion(instance)) in megasas_init_adapter_fusion()
1826 if (megasas_ioc_init_fusion(instance)) { in megasas_init_adapter_fusion()
1827 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_init_adapter_fusion()
1832 (instance, true, 0) == FAILED) in megasas_init_adapter_fusion()
1835 if (megasas_ioc_init_fusion(instance)) in megasas_init_adapter_fusion()
1842 megasas_display_intel_branding(instance); in megasas_init_adapter_fusion()
1843 if (megasas_get_ctrl_info(instance)) { in megasas_init_adapter_fusion()
1844 dev_err(&instance->pdev->dev, in megasas_init_adapter_fusion()
1850 instance->flag_ieee = 1; in megasas_init_adapter_fusion()
1851 instance->r1_ldio_hint_default = MR_R1_LDIO_PIGGYBACK_DEFAULT; in megasas_init_adapter_fusion()
1852 instance->threshold_reply_count = instance->max_fw_cmds / 4; in megasas_init_adapter_fusion()
1855 if (megasas_allocate_raid_maps(instance)) in megasas_init_adapter_fusion()
1858 if (!megasas_get_map_info(instance)) in megasas_init_adapter_fusion()
1859 megasas_sync_map_info(instance); in megasas_init_adapter_fusion()
1864 megasas_free_cmds_fusion(instance); in megasas_init_adapter_fusion()
1866 megasas_free_cmds(instance); in megasas_init_adapter_fusion()
1868 megasas_free_ioc_init_cmd(instance); in megasas_init_adapter_fusion()
1879 struct megasas_instance *instance = in megasas_fault_detect_work() local
1885 fw_state = instance->instancet->read_fw_status_reg(instance) & in megasas_fault_detect_work()
1889 dma_state = instance->instancet->read_fw_status_reg(instance) & in megasas_fault_detect_work()
1892 if (instance->crash_dump_drv_support && in megasas_fault_detect_work()
1893 instance->crash_dump_app_support && dma_state) { in megasas_fault_detect_work()
1894 megasas_fusion_crash_dump(instance); in megasas_fault_detect_work()
1896 if (instance->unload == 0) { in megasas_fault_detect_work()
1897 status = megasas_reset_fusion(instance->host, 0); in megasas_fault_detect_work()
1899 dev_err(&instance->pdev->dev, in megasas_fault_detect_work()
1908 if (instance->fw_fault_work_q) in megasas_fault_detect_work()
1909 queue_delayed_work(instance->fw_fault_work_q, in megasas_fault_detect_work()
1910 &instance->fw_fault_work, in megasas_fault_detect_work()
1915 megasas_fusion_start_watchdog(struct megasas_instance *instance) in megasas_fusion_start_watchdog() argument
1918 if (instance->fw_fault_work_q) in megasas_fusion_start_watchdog()
1921 INIT_DELAYED_WORK(&instance->fw_fault_work, megasas_fault_detect_work); in megasas_fusion_start_watchdog()
1923 snprintf(instance->fault_handler_work_q_name, in megasas_fusion_start_watchdog()
1924 sizeof(instance->fault_handler_work_q_name), in megasas_fusion_start_watchdog()
1925 "poll_megasas%d_status", instance->host->host_no); in megasas_fusion_start_watchdog()
1927 instance->fw_fault_work_q = in megasas_fusion_start_watchdog()
1928 create_singlethread_workqueue(instance->fault_handler_work_q_name); in megasas_fusion_start_watchdog()
1929 if (!instance->fw_fault_work_q) { in megasas_fusion_start_watchdog()
1930 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_fusion_start_watchdog()
1935 queue_delayed_work(instance->fw_fault_work_q, in megasas_fusion_start_watchdog()
1936 &instance->fw_fault_work, in megasas_fusion_start_watchdog()
1943 megasas_fusion_stop_watchdog(struct megasas_instance *instance) in megasas_fusion_stop_watchdog() argument
1947 if (instance->fw_fault_work_q) { in megasas_fusion_stop_watchdog()
1948 wq = instance->fw_fault_work_q; in megasas_fusion_stop_watchdog()
1949 instance->fw_fault_work_q = NULL; in megasas_fusion_stop_watchdog()
1950 if (!cancel_delayed_work_sync(&instance->fw_fault_work)) in megasas_fusion_stop_watchdog()
2036 megasas_is_prp_possible(struct megasas_instance *instance, in megasas_is_prp_possible() argument
2045 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_is_prp_possible()
2142 megasas_make_prp_nvme(struct megasas_instance *instance, struct scsi_cmnd *scmd, in megasas_make_prp_nvme() argument
2156 u32 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_make_prp_nvme()
2159 build_prp = megasas_is_prp_possible(instance, scmd, sge_count); in megasas_make_prp_nvme()
2179 memset(ptr_sgl, 0, instance->max_chain_frame_sz); in megasas_make_prp_nvme()
2265 megasas_make_sgl_fusion(struct megasas_instance *instance, in megasas_make_sgl_fusion() argument
2274 fusion = instance->ctrl_context; in megasas_make_sgl_fusion()
2276 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2286 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2296 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2312 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2323 memset(sgl_ptr, 0, instance->max_chain_frame_sz); in megasas_make_sgl_fusion()
2342 int megasas_make_sgl(struct megasas_instance *instance, struct scsi_cmnd *scp, in megasas_make_sgl() argument
2351 if ((sge_count > instance->max_num_sge) || (sge_count <= 0)) in megasas_make_sgl()
2358 build_prp = megasas_make_prp_nvme(instance, scp, sgl_chain64, in megasas_make_sgl()
2362 megasas_make_sgl_fusion(instance, scp, sgl_chain64, in megasas_make_sgl()
2554 static void megasas_stream_detect(struct megasas_instance *instance, in megasas_stream_detect() argument
2558 struct fusion_context *fusion = instance->ctrl_context; in megasas_stream_detect()
2716 megasas_build_ldio_fusion(struct megasas_instance *instance, in megasas_build_ldio_fusion() argument
2737 fusion = instance->ctrl_context; in megasas_build_ldio_fusion()
2813 local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_ldio_fusion()
2816 if (ld < instance->fw_supported_vd_count) in megasas_build_ldio_fusion()
2823 if (MR_BuildRaidContext(instance, &io_info, rctx, in megasas_build_ldio_fusion()
2828 if ((instance->perf_mode == MR_BALANCED_PERF_MODE) && in megasas_build_ldio_fusion()
2832 mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) / in megasas_build_ldio_fusion()
2833 MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start); in megasas_build_ldio_fusion()
2834 else if (instance->msix_load_balance) in megasas_build_ldio_fusion()
2836 (mega_mod64(atomic64_add_return(1, &instance->total_io_count), in megasas_build_ldio_fusion()
2837 instance->msix_vectors)); in megasas_build_ldio_fusion()
2840 instance->reply_map[raw_smp_processor_id()]; in megasas_build_ldio_fusion()
2842 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2854 if (atomic_inc_return(&instance->fw_outstanding) > in megasas_build_ldio_fusion()
2855 (instance->host->can_queue)) { in megasas_build_ldio_fusion()
2857 atomic_dec(&instance->fw_outstanding); in megasas_build_ldio_fusion()
2862 atomic_dec(&instance->fw_outstanding); in megasas_build_ldio_fusion()
2865 instance->r1_ldio_hint_default); in megasas_build_ldio_fusion()
2871 spin_lock_irqsave(&instance->stream_lock, in megasas_build_ldio_fusion()
2873 megasas_stream_detect(instance, cmd, &io_info); in megasas_build_ldio_fusion()
2874 spin_unlock_irqrestore(&instance->stream_lock, in megasas_build_ldio_fusion()
2900 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2907 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2918 get_updated_dev_handle(instance, in megasas_build_ldio_fusion()
2923 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2931 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2938 instance->dev_handle = !(instance->dev_handle); in megasas_build_ldio_fusion()
2940 local_map_ptr->raidMap.devHndlInfo[io_info.pd_after_lb].devHandle[instance->dev_handle]; in megasas_build_ldio_fusion()
2954 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2965 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2984 static void megasas_build_ld_nonrw_fusion(struct megasas_instance *instance, in megasas_build_ld_nonrw_fusion() argument
2991 struct fusion_context *fusion = instance->ctrl_context; in megasas_build_ld_nonrw_fusion()
3001 local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_ld_nonrw_fusion()
3011 device_id < instance->fw_supported_vd_count)) { in megasas_build_ld_nonrw_fusion()
3014 if (ld >= instance->fw_supported_vd_count - 1) in megasas_build_ld_nonrw_fusion()
3037 if (instance->adapter_type < VENTURA_SERIES) in megasas_build_ld_nonrw_fusion()
3074 megasas_build_syspd_fusion(struct megasas_instance *instance, in megasas_build_syspd_fusion() argument
3087 struct fusion_context *fusion = instance->ctrl_context; in megasas_build_syspd_fusion()
3088 pd_sync = (void *)fusion->pd_seq_sync[(instance->pd_seq_map_id - 1) & 1]; in megasas_build_syspd_fusion()
3108 if (instance->support_seqnum_jbod_fp) { in megasas_build_syspd_fusion()
3109 if (instance->use_seqnum_jbod_fp && in megasas_build_syspd_fusion()
3110 instance->pd_list[pd_index].driveType == TYPE_DISK) { in megasas_build_syspd_fusion()
3113 if (instance->support_morethan256jbod) in megasas_build_syspd_fusion()
3124 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_syspd_fusion()
3151 fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_syspd_fusion()
3161 if ((instance->perf_mode == MR_BALANCED_PERF_MODE) && in megasas_build_syspd_fusion()
3164 mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) / in megasas_build_syspd_fusion()
3165 MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start); in megasas_build_syspd_fusion()
3166 else if (instance->msix_load_balance) in megasas_build_syspd_fusion()
3168 (mega_mod64(atomic64_add_return(1, &instance->total_io_count), in megasas_build_syspd_fusion()
3169 instance->msix_vectors)); in megasas_build_syspd_fusion()
3172 instance->reply_map[raw_smp_processor_id()]; in megasas_build_syspd_fusion()
3193 if (instance->adapter_type >= INVADER_SERIES) in megasas_build_syspd_fusion()
3213 megasas_build_io_fusion(struct megasas_instance *instance, in megasas_build_io_fusion() argument
3244 megasas_build_ldio_fusion(instance, scp, cmd); in megasas_build_io_fusion()
3247 megasas_build_ld_nonrw_fusion(instance, scp, cmd); in megasas_build_io_fusion()
3250 megasas_build_syspd_fusion(instance, scp, cmd, true); in megasas_build_io_fusion()
3253 if (instance->secure_jbod_support || in megasas_build_io_fusion()
3255 megasas_build_syspd_fusion(instance, scp, cmd, false); in megasas_build_io_fusion()
3257 megasas_build_syspd_fusion(instance, scp, cmd, true); in megasas_build_io_fusion()
3267 sge_count = megasas_make_sgl(instance, scp, cmd); in megasas_build_io_fusion()
3269 if (sge_count > instance->max_num_sge || (sge_count < 0)) { in megasas_build_io_fusion()
3270 dev_err(&instance->pdev->dev, in megasas_build_io_fusion()
3272 __func__, __LINE__, sge_count, instance->max_num_sge); in megasas_build_io_fusion()
3276 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_io_fusion()
3310 megasas_get_request_descriptor(struct megasas_instance *instance, u16 index) in megasas_get_request_descriptor() argument
3315 fusion = instance->ctrl_context; in megasas_get_request_descriptor()
3326 static void megasas_prepare_secondRaid1_IO(struct megasas_instance *instance, in megasas_prepare_secondRaid1_IO() argument
3332 fusion = instance->ctrl_context; in megasas_prepare_secondRaid1_IO()
3343 req_desc2 = megasas_get_request_descriptor(instance, in megasas_prepare_secondRaid1_IO()
3371 megasas_build_and_issue_cmd_fusion(struct megasas_instance *instance, in megasas_build_and_issue_cmd_fusion() argument
3379 instance->ldio_threshold && in megasas_build_and_issue_cmd_fusion()
3380 (atomic_inc_return(&instance->ldio_outstanding) > in megasas_build_and_issue_cmd_fusion()
3381 instance->ldio_threshold)) { in megasas_build_and_issue_cmd_fusion()
3382 atomic_dec(&instance->ldio_outstanding); in megasas_build_and_issue_cmd_fusion()
3386 if (atomic_inc_return(&instance->fw_outstanding) > in megasas_build_and_issue_cmd_fusion()
3387 instance->host->can_queue) { in megasas_build_and_issue_cmd_fusion()
3388 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3392 cmd = megasas_get_cmd_fusion(instance, scmd->request->tag); in megasas_build_and_issue_cmd_fusion()
3395 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3401 req_desc = megasas_get_request_descriptor(instance, index-1); in megasas_build_and_issue_cmd_fusion()
3406 if (megasas_build_io_fusion(instance, scmd, cmd)) { in megasas_build_and_issue_cmd_fusion()
3407 megasas_return_cmd_fusion(instance, cmd); in megasas_build_and_issue_cmd_fusion()
3408 dev_err(&instance->pdev->dev, "Error building command\n"); in megasas_build_and_issue_cmd_fusion()
3410 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3419 dev_err(&instance->pdev->dev, "The chain offset value is not " in megasas_build_and_issue_cmd_fusion()
3432 r1_cmd = megasas_get_cmd_fusion(instance, in megasas_build_and_issue_cmd_fusion()
3433 (scmd->request->tag + instance->max_fw_cmds)); in megasas_build_and_issue_cmd_fusion()
3434 megasas_prepare_secondRaid1_IO(instance, cmd, r1_cmd); in megasas_build_and_issue_cmd_fusion()
3442 megasas_fire_cmd_fusion(instance, req_desc); in megasas_build_and_issue_cmd_fusion()
3445 megasas_fire_cmd_fusion(instance, r1_cmd->request_desc); in megasas_build_and_issue_cmd_fusion()
3459 megasas_complete_r1_command(struct megasas_instance *instance, in megasas_complete_r1_command() argument
3471 fusion = instance->ctrl_context; in megasas_complete_r1_command()
3493 megasas_return_cmd_fusion(instance, r1_cmd); in megasas_complete_r1_command()
3496 if (instance->ldio_threshold && in megasas_complete_r1_command()
3498 atomic_dec(&instance->ldio_outstanding); in megasas_complete_r1_command()
3500 megasas_return_cmd_fusion(instance, cmd); in megasas_complete_r1_command()
3512 complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex, in complete_cmd_fusion() argument
3531 fusion = instance->ctrl_context; in complete_cmd_fusion()
3533 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in complete_cmd_fusion()
3571 dev_dbg(&instance->pdev->dev, "TM completion:" in complete_cmd_fusion()
3588 atomic_dec(&instance->fw_outstanding); in complete_cmd_fusion()
3593 if (instance->ldio_threshold && in complete_cmd_fusion()
3595 atomic_dec(&instance->ldio_outstanding); in complete_cmd_fusion()
3597 megasas_return_cmd_fusion(instance, cmd_fusion); in complete_cmd_fusion()
3601 megasas_complete_r1_command(instance, cmd_fusion); in complete_cmd_fusion()
3604 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in complete_cmd_fusion()
3610 megasas_return_cmd(instance, cmd_mfi); in complete_cmd_fusion()
3612 megasas_complete_cmd(instance, cmd_mfi, DID_OK); in complete_cmd_fusion()
3646 if (threshold_reply_count >= instance->threshold_reply_count) { in complete_cmd_fusion()
3647 if (instance->msix_combined) in complete_cmd_fusion()
3650 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3654 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3669 if (instance->msix_combined) in complete_cmd_fusion()
3672 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3676 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3677 megasas_check_and_restore_queue_depth(instance); in complete_cmd_fusion()
3685 static void megasas_enable_irq_poll(struct megasas_instance *instance) in megasas_enable_irq_poll() argument
3690 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_enable_irq_poll()
3693 irq_ctx = &instance->irq_context[i]; in megasas_enable_irq_poll()
3705 struct megasas_instance *instance = in megasas_sync_irqs() local
3709 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_sync_irqs()
3712 synchronize_irq(pci_irq_vector(instance->pdev, i)); in megasas_sync_irqs()
3713 irq_ctx = &instance->irq_context[i]; in megasas_sync_irqs()
3733 struct megasas_instance *instance; in megasas_irqpoll() local
3737 instance = irq_ctx->instance; in megasas_irqpoll()
3744 num_entries = complete_cmd_fusion(instance, irq_ctx->MSIxIndex, irq_ctx); in megasas_irqpoll()
3763 struct megasas_instance *instance = in megasas_complete_cmd_dpc_fusion() local
3767 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_complete_cmd_dpc_fusion()
3770 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in megasas_complete_cmd_dpc_fusion()
3774 complete_cmd_fusion(instance, MSIxIndex, NULL); in megasas_complete_cmd_dpc_fusion()
3783 struct megasas_instance *instance = irq_context->instance; in megasas_isr_fusion() local
3786 if (instance->mask_interrupts) in megasas_isr_fusion()
3794 if (!instance->msix_vectors) { in megasas_isr_fusion()
3795 mfiStatus = instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3801 if (test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) { in megasas_isr_fusion()
3802 instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3806 return complete_cmd_fusion(instance, irq_context->MSIxIndex, irq_context) in megasas_isr_fusion()
3817 build_mpt_mfi_pass_thru(struct megasas_instance *instance, in build_mpt_mfi_pass_thru() argument
3826 fusion = instance->ctrl_context; in build_mpt_mfi_pass_thru()
3828 cmd = megasas_get_cmd_fusion(instance, in build_mpt_mfi_pass_thru()
3829 instance->max_scsi_cmds + mfi_cmd->index); in build_mpt_mfi_pass_thru()
3845 if (instance->adapter_type >= INVADER_SERIES) { in build_mpt_mfi_pass_thru()
3865 mpi25_ieee_chain->Length = cpu_to_le32(instance->mfi_frame_size); in build_mpt_mfi_pass_thru()
3875 build_mpt_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd) in build_mpt_cmd() argument
3880 build_mpt_mfi_pass_thru(instance, cmd); in build_mpt_cmd()
3883 req_desc = megasas_get_request_descriptor(instance, index - 1); in build_mpt_cmd()
3901 megasas_issue_dcmd_fusion(struct megasas_instance *instance, in megasas_issue_dcmd_fusion() argument
3906 req_desc = build_mpt_cmd(instance, cmd); in megasas_issue_dcmd_fusion()
3908 megasas_fire_cmd_fusion(instance, req_desc); in megasas_issue_dcmd_fusion()
3917 megasas_release_fusion(struct megasas_instance *instance) in megasas_release_fusion() argument
3919 megasas_free_ioc_init_cmd(instance); in megasas_release_fusion()
3920 megasas_free_cmds(instance); in megasas_release_fusion()
3921 megasas_free_cmds_fusion(instance); in megasas_release_fusion()
3923 iounmap(instance->reg_set); in megasas_release_fusion()
3925 pci_release_selected_regions(instance->pdev, 1<<instance->bar); in megasas_release_fusion()
3933 megasas_read_fw_status_reg_fusion(struct megasas_instance *instance) in megasas_read_fw_status_reg_fusion() argument
3935 return megasas_readl(instance, &instance->reg_set->outbound_scratch_pad_0); in megasas_read_fw_status_reg_fusion()
3944 megasas_alloc_host_crash_buffer(struct megasas_instance *instance) in megasas_alloc_host_crash_buffer() argument
3949 instance->crash_buf[i] = vzalloc(CRASH_DMA_BUF_SIZE); in megasas_alloc_host_crash_buffer()
3950 if (!instance->crash_buf[i]) { in megasas_alloc_host_crash_buffer()
3951 dev_info(&instance->pdev->dev, "Firmware crash dump " in megasas_alloc_host_crash_buffer()
3956 instance->drv_buf_alloc = i; in megasas_alloc_host_crash_buffer()
3964 megasas_free_host_crash_buffer(struct megasas_instance *instance) in megasas_free_host_crash_buffer() argument
3967 for (i = 0; i < instance->drv_buf_alloc; i++) { in megasas_free_host_crash_buffer()
3968 if (instance->crash_buf[i]) in megasas_free_host_crash_buffer()
3969 vfree(instance->crash_buf[i]); in megasas_free_host_crash_buffer()
3971 instance->drv_buf_index = 0; in megasas_free_host_crash_buffer()
3972 instance->drv_buf_alloc = 0; in megasas_free_host_crash_buffer()
3973 instance->fw_crash_state = UNAVAILABLE; in megasas_free_host_crash_buffer()
3974 instance->fw_crash_buffer_size = 0; in megasas_free_host_crash_buffer()
3982 megasas_adp_reset_fusion(struct megasas_instance *instance, in megasas_adp_reset_fusion() argument
3988 writel(MPI2_WRSEQ_FLUSH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3989 writel(MPI2_WRSEQ_1ST_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3990 writel(MPI2_WRSEQ_2ND_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3991 writel(MPI2_WRSEQ_3RD_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3992 writel(MPI2_WRSEQ_4TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3993 writel(MPI2_WRSEQ_5TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3994 writel(MPI2_WRSEQ_6TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3997 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
4001 host_diag = megasas_readl(instance, in megasas_adp_reset_fusion()
4002 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
4004 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
4015 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
4019 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
4023 host_diag = megasas_readl(instance, in megasas_adp_reset_fusion()
4024 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
4026 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
4035 abs_state = instance->instancet->read_fw_status_reg(instance) in megasas_adp_reset_fusion()
4041 abs_state = instance->instancet-> in megasas_adp_reset_fusion()
4042 read_fw_status_reg(instance) & MFI_STATE_MASK; in megasas_adp_reset_fusion()
4045 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
4059 megasas_check_reset_fusion(struct megasas_instance *instance, in megasas_check_reset_fusion() argument
4069 static inline void megasas_trigger_snap_dump(struct megasas_instance *instance) in megasas_trigger_snap_dump() argument
4074 if (!instance->disableOnlineCtrlReset) { in megasas_trigger_snap_dump()
4075 dev_info(&instance->pdev->dev, "Trigger snap dump\n"); in megasas_trigger_snap_dump()
4077 &instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4078 readl(&instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4081 for (j = 0; j < instance->snapdump_wait_time; j++) { in megasas_trigger_snap_dump()
4082 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_trigger_snap_dump()
4085 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_trigger_snap_dump()
4097 megasas_wait_for_outstanding_fusion(struct megasas_instance *instance, in megasas_wait_for_outstanding_fusion() argument
4106 (resetwaittime - instance->snapdump_wait_time)); in megasas_wait_for_outstanding_fusion()
4109 dev_info(&instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4111 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4112 if (instance->snapdump_wait_time) in megasas_wait_for_outstanding_fusion()
4113 megasas_trigger_snap_dump(instance); in megasas_wait_for_outstanding_fusion()
4120 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_wait_for_outstanding_fusion()
4123 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4127 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4128 if (instance->requestorId && reason) { in megasas_wait_for_outstanding_fusion()
4129 dev_warn(&instance->pdev->dev, "SR-IOV Found FW in FAULT" in megasas_wait_for_outstanding_fusion()
4132 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4142 if (instance->requestorId && !reason) { in megasas_wait_for_outstanding_fusion()
4148 if (instance->requestorId && (reason == SCSIIO_TIMEOUT_OCR)) { in megasas_wait_for_outstanding_fusion()
4149 if (instance->hb_host_mem->HB.fwCounter != in megasas_wait_for_outstanding_fusion()
4150 instance->hb_host_mem->HB.driverCounter) { in megasas_wait_for_outstanding_fusion()
4151 instance->hb_host_mem->HB.driverCounter = in megasas_wait_for_outstanding_fusion()
4152 instance->hb_host_mem->HB.fwCounter; in megasas_wait_for_outstanding_fusion()
4158 dev_warn(&instance->pdev->dev, "SR-IOV:" in megasas_wait_for_outstanding_fusion()
4163 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4171 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4172 outstanding = atomic_read(&instance->fw_outstanding); in megasas_wait_for_outstanding_fusion()
4177 dev_notice(&instance->pdev->dev, "[%2d]waiting for %d " in megasas_wait_for_outstanding_fusion()
4179 outstanding, instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4184 if (instance->snapdump_wait_time) { in megasas_wait_for_outstanding_fusion()
4185 megasas_trigger_snap_dump(instance); in megasas_wait_for_outstanding_fusion()
4190 if (atomic_read(&instance->fw_outstanding)) { in megasas_wait_for_outstanding_fusion()
4191 dev_err(&instance->pdev->dev, "pending commands remain after waiting, " in megasas_wait_for_outstanding_fusion()
4193 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4202 void megasas_reset_reply_desc(struct megasas_instance *instance) in megasas_reset_reply_desc() argument
4208 fusion = instance->ctrl_context; in megasas_reset_reply_desc()
4209 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_reset_reply_desc()
4222 static void megasas_refire_mgmt_cmd(struct megasas_instance *instance) in megasas_refire_mgmt_cmd() argument
4234 fusion = instance->ctrl_context; in megasas_refire_mgmt_cmd()
4239 for (j = instance->max_scsi_cmds ; j < instance->max_fw_cmds; j++) { in megasas_refire_mgmt_cmd()
4241 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in megasas_refire_mgmt_cmd()
4248 req_desc = megasas_get_request_descriptor(instance, smid - 1); in megasas_refire_mgmt_cmd()
4269 if (!instance->support_nvme_passthru) { in megasas_refire_mgmt_cmd()
4276 if (!instance->support_pci_lane_margining) { in megasas_refire_mgmt_cmd()
4288 megasas_fire_cmd_fusion(instance, req_desc); in megasas_refire_mgmt_cmd()
4291 megasas_return_cmd(instance, cmd_mfi); in megasas_refire_mgmt_cmd()
4294 megasas_complete_cmd(instance, cmd_mfi, DID_OK); in megasas_refire_mgmt_cmd()
4309 static int megasas_track_scsiio(struct megasas_instance *instance, in megasas_track_scsiio() argument
4315 fusion = instance->ctrl_context; in megasas_track_scsiio()
4317 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_track_scsiio()
4322 dev_info(&instance->pdev->dev, in megasas_track_scsiio()
4343 megasas_tm_response_code(struct megasas_instance *instance, in megasas_tm_response_code() argument
4377 dev_dbg(&instance->pdev->dev, "response_code(%01x): %s\n", in megasas_tm_response_code()
4379 dev_dbg(&instance->pdev->dev, in megasas_tm_response_code()
4404 megasas_issue_tm(struct megasas_instance *instance, u16 device_handle, in megasas_issue_tm() argument
4420 fusion = instance->ctrl_context; in megasas_issue_tm()
4422 cmd_mfi = megasas_get_cmd(instance); in megasas_issue_tm()
4425 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_issue_tm()
4430 cmd_fusion = megasas_get_cmd_fusion(instance, in megasas_issue_tm()
4431 instance->max_scsi_cmds + cmd_mfi->index); in megasas_issue_tm()
4436 req_desc = megasas_get_request_descriptor(instance, in megasas_issue_tm()
4467 megasas_fire_cmd_fusion(instance, req_desc); in megasas_issue_tm()
4481 dev_err(&instance->pdev->dev, in megasas_issue_tm()
4484 mutex_unlock(&instance->reset_mutex); in megasas_issue_tm()
4485 rc = megasas_reset_fusion(instance->host, MFI_IO_TIMEOUT_OCR); in megasas_issue_tm()
4486 mutex_lock(&instance->reset_mutex); in megasas_issue_tm()
4491 megasas_tm_response_code(instance, mpi_reply); in megasas_issue_tm()
4493 megasas_return_cmd(instance, cmd_mfi); in megasas_issue_tm()
4502 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4503 megasas_sync_irqs((unsigned long)instance); in megasas_issue_tm()
4504 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4505 megasas_enable_irq_poll(instance); in megasas_issue_tm()
4515 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4516 megasas_sync_irqs((unsigned long)instance); in megasas_issue_tm()
4517 rc = megasas_track_scsiio(instance, id, channel); in megasas_issue_tm()
4518 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4519 megasas_enable_irq_poll(instance); in megasas_issue_tm()
4543 struct megasas_instance *instance; in megasas_fusion_smid_lookup() local
4547 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_fusion_smid_lookup()
4549 fusion = instance->ctrl_context; in megasas_fusion_smid_lookup()
4551 for (i = 0; i < instance->max_scsi_cmds; i++) { in megasas_fusion_smid_lookup()
4574 struct megasas_instance *instance; in megasas_get_tm_devhandle() local
4579 instance = (struct megasas_instance *)sdev->host->hostdata; in megasas_get_tm_devhandle()
4580 fusion = instance->ctrl_context; in megasas_get_tm_devhandle()
4583 if (instance->use_seqnum_jbod_fp) { in megasas_get_tm_devhandle()
4587 [(instance->pd_seq_map_id - 1) & 1]; in megasas_get_tm_devhandle()
4610 struct megasas_instance *instance; in megasas_task_abort_fusion() local
4616 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_task_abort_fusion()
4618 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_task_abort_fusion()
4619 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_task_abort_fusion()
4620 "SCSI host:%d\n", instance->host->host_no); in megasas_task_abort_fusion()
4638 mutex_lock(&instance->reset_mutex); in megasas_task_abort_fusion()
4646 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4656 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4664 ret = megasas_issue_tm(instance, devhandle, in megasas_task_abort_fusion()
4670 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4691 struct megasas_instance *instance; in megasas_reset_target_fusion() local
4697 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_reset_target_fusion()
4699 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_reset_target_fusion()
4700 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_reset_target_fusion()
4701 "SCSI host:%d\n", instance->host->host_no); in megasas_reset_target_fusion()
4719 mutex_lock(&instance->reset_mutex); in megasas_reset_target_fusion()
4726 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4734 ret = megasas_issue_tm(instance, devhandle, in megasas_reset_target_fusion()
4739 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4749 megasas_instance *megasas_get_peer_instance(struct megasas_instance *instance) in megasas_get_peer_instance() argument
4754 if (megasas_mgmt_info.instance[i] && in megasas_get_peer_instance()
4755 (megasas_mgmt_info.instance[i] != instance) && in megasas_get_peer_instance()
4756 megasas_mgmt_info.instance[i]->requestorId && in megasas_get_peer_instance()
4757 megasas_mgmt_info.instance[i]->peerIsPresent && in megasas_get_peer_instance()
4758 (memcmp((megasas_mgmt_info.instance[i]->clusterId), in megasas_get_peer_instance()
4759 instance->clusterId, MEGASAS_CLUSTER_ID_SIZE) == 0)) in megasas_get_peer_instance()
4760 return megasas_mgmt_info.instance[i]; in megasas_get_peer_instance()
4766 int megasas_check_mpio_paths(struct megasas_instance *instance, in megasas_check_mpio_paths() argument
4772 if (instance->peerIsPresent) { in megasas_check_mpio_paths()
4773 peer_instance = megasas_get_peer_instance(instance); in megasas_check_mpio_paths()
4786 struct megasas_instance *instance; in megasas_reset_fusion() local
4798 instance = (struct megasas_instance *)shost->hostdata; in megasas_reset_fusion()
4799 fusion = instance->ctrl_context; in megasas_reset_fusion()
4801 mutex_lock(&instance->reset_mutex); in megasas_reset_fusion()
4803 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { in megasas_reset_fusion()
4804 dev_warn(&instance->pdev->dev, "Hardware critical error, " in megasas_reset_fusion()
4806 instance->host->host_no); in megasas_reset_fusion()
4807 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4810 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4814 if (abs_state != MFI_STATE_FAULT && instance->crash_dump_buf && in megasas_reset_fusion()
4815 instance->crash_dump_app_support && reason) { in megasas_reset_fusion()
4816 dev_info(&instance->pdev->dev, "IO/DCMD timeout is detected, " in megasas_reset_fusion()
4818 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4819 status_reg = megasas_readl(instance, &instance->reg_set->doorbell); in megasas_reset_fusion()
4821 &instance->reg_set->doorbell); in megasas_reset_fusion()
4822 readl(&instance->reg_set->doorbell); in megasas_reset_fusion()
4823 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4827 dev_dbg(&instance->pdev->dev, "waiting for [%d] " in megasas_reset_fusion()
4830 } while ((atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) && in megasas_reset_fusion()
4833 if (atomic_read(&instance->adprecovery) == MEGASAS_HBA_OPERATIONAL) { in megasas_reset_fusion()
4834 dev_info(&instance->pdev->dev, "OCR done for IO " in megasas_reset_fusion()
4838 dev_info(&instance->pdev->dev, "Controller is not " in megasas_reset_fusion()
4847 if (instance->requestorId && !instance->skip_heartbeat_timer_del) in megasas_reset_fusion()
4848 del_timer_sync(&instance->sriov_heartbeat_timer); in megasas_reset_fusion()
4849 set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
4850 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); in megasas_reset_fusion()
4851 instance->instancet->disable_intr(instance); in megasas_reset_fusion()
4852 megasas_sync_irqs((unsigned long)instance); in megasas_reset_fusion()
4855 if (megasas_wait_for_outstanding_fusion(instance, reason, in megasas_reset_fusion()
4857 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4858 dev_warn(&instance->pdev->dev, "resetting fusion " in megasas_reset_fusion()
4859 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4864 dev_info(&instance->pdev->dev, "\nPending SCSI commands:\n"); in megasas_reset_fusion()
4867 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_reset_fusion()
4870 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4871 r1_cmd = fusion->cmd_list[i + instance->max_fw_cmds]; in megasas_reset_fusion()
4872 megasas_return_cmd_fusion(instance, r1_cmd); in megasas_reset_fusion()
4888 megasas_check_mpio_paths(instance, in megasas_reset_fusion()
4890 if (instance->ldio_threshold && in megasas_reset_fusion()
4892 atomic_dec(&instance->ldio_outstanding); in megasas_reset_fusion()
4893 megasas_return_cmd_fusion(instance, cmd_fusion); in megasas_reset_fusion()
4899 dev_info(&instance->pdev->dev, "Outstanding fastpath IOs: %d\n", in megasas_reset_fusion()
4902 atomic_set(&instance->fw_outstanding, 0); in megasas_reset_fusion()
4904 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4907 if (instance->disableOnlineCtrlReset || in megasas_reset_fusion()
4910 dev_warn(&instance->pdev->dev, "Reset not supported" in megasas_reset_fusion()
4912 instance->host->host_no); in megasas_reset_fusion()
4917 if (instance->requestorId && !reason) { in megasas_reset_fusion()
4929 if (megasas_adp_reset_wait_for_ready(instance, in megasas_reset_fusion()
4934 if (megasas_transition_to_ready(instance, 1)) { in megasas_reset_fusion()
4935 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
4937 "scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4940 megasas_reset_reply_desc(instance); in megasas_reset_fusion()
4941 megasas_fusion_update_can_queue(instance, OCR_CONTEXT); in megasas_reset_fusion()
4943 if (megasas_ioc_init_fusion(instance)) { in megasas_reset_fusion()
4947 if (megasas_get_ctrl_info(instance)) { in megasas_reset_fusion()
4948 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
4954 megasas_refire_mgmt_cmd(instance); in megasas_reset_fusion()
4962 if (!megasas_get_map_info(instance)) in megasas_reset_fusion()
4963 megasas_sync_map_info(instance); in megasas_reset_fusion()
4965 megasas_setup_jbod_map(instance); in megasas_reset_fusion()
4968 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4978 &instance->reset_flags); in megasas_reset_fusion()
4979 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
4980 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
4982 if ((instance->tgt_prop) && in megasas_reset_fusion()
4983 (instance->nvme_page_size)) in megasas_reset_fusion()
4984 ret_target_prop = megasas_get_target_prop(instance, sdev); in megasas_reset_fusion()
4990 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
4992 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
4994 instance->host->host_no); in megasas_reset_fusion()
4997 if (instance->requestorId) { in megasas_reset_fusion()
4998 if (!megasas_sriov_start_heartbeat(instance, 0)) in megasas_reset_fusion()
4999 megasas_start_timer(instance); in megasas_reset_fusion()
5001 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5004 if (instance->crash_dump_drv_support && in megasas_reset_fusion()
5005 instance->crash_dump_app_support) in megasas_reset_fusion()
5006 megasas_set_crash_dump_params(instance, in megasas_reset_fusion()
5009 megasas_set_crash_dump_params(instance, in megasas_reset_fusion()
5012 if (instance->snapdump_wait_time) { in megasas_reset_fusion()
5013 megasas_get_snapdump_properties(instance); in megasas_reset_fusion()
5014 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5016 instance->snapdump_wait_time); in megasas_reset_fusion()
5022 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
5024 instance->host->host_no); in megasas_reset_fusion()
5029 dev_warn(&instance->pdev->dev, "Reset failed, killing " in megasas_reset_fusion()
5030 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
5034 if (instance->requestorId) { in megasas_reset_fusion()
5035 megasas_start_timer(instance); in megasas_reset_fusion()
5037 clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
5038 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
5039 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
5040 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
5044 megaraid_sas_kill_hba(instance); in megasas_reset_fusion()
5045 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
5046 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5049 clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
5050 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
5055 static void megasas_fusion_crash_dump(struct megasas_instance *instance) in megasas_fusion_crash_dump() argument
5062 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5068 if (instance->drv_buf_index == 0) { in megasas_fusion_crash_dump()
5072 if (instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5073 dev_info(&instance->pdev->dev, "earlier crash dump is " in megasas_fusion_crash_dump()
5078 &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5079 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5082 megasas_alloc_host_crash_buffer(instance); in megasas_fusion_crash_dump()
5083 dev_info(&instance->pdev->dev, "Number of host crash buffers " in megasas_fusion_crash_dump()
5084 "allocated: %d\n", instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5097 status_reg = instance->instancet->read_fw_status_reg( in megasas_fusion_crash_dump()
5098 instance); in megasas_fusion_crash_dump()
5103 if (instance->drv_buf_index >= instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5104 dev_info(&instance->pdev->dev, in megasas_fusion_crash_dump()
5106 instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5111 memcpy(instance->crash_buf[instance->drv_buf_index], in megasas_fusion_crash_dump()
5112 instance->crash_dump_buf, CRASH_DMA_BUF_SIZE); in megasas_fusion_crash_dump()
5113 instance->drv_buf_index++; in megasas_fusion_crash_dump()
5117 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5118 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5121 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5125 dev_info(&instance->pdev->dev, "Crash Dump is available,number " in megasas_fusion_crash_dump()
5126 "of copied buffers: %d\n", instance->drv_buf_index); in megasas_fusion_crash_dump()
5127 instance->fw_crash_buffer_size = instance->drv_buf_index; in megasas_fusion_crash_dump()
5128 instance->fw_crash_state = AVAILABLE; in megasas_fusion_crash_dump()
5129 instance->drv_buf_index = 0; in megasas_fusion_crash_dump()
5130 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5131 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5133 megasas_reset_fusion(instance->host, 0); in megasas_fusion_crash_dump()
5141 struct megasas_instance *instance = in megasas_fusion_ocr_wq() local
5144 megasas_reset_fusion(instance->host, 0); in megasas_fusion_ocr_wq()
5149 megasas_alloc_fusion_context(struct megasas_instance *instance) in megasas_alloc_fusion_context() argument
5153 instance->ctrl_context = kzalloc(sizeof(struct fusion_context), in megasas_alloc_fusion_context()
5155 if (!instance->ctrl_context) { in megasas_alloc_fusion_context()
5156 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5161 fusion = instance->ctrl_context; in megasas_alloc_fusion_context()
5173 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5189 dev_err(&instance->pdev->dev, "Failed to allocate load_balance_info, " in megasas_alloc_fusion_context()
5197 megasas_free_fusion_context(struct megasas_instance *instance) in megasas_free_fusion_context() argument
5199 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_fusion_context()