Lines Matching full:instance
52 megasas_complete_cmd(struct megasas_instance *instance,
55 wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd,
59 megasas_clear_intr_fusion(struct megasas_instance *instance);
61 int megasas_transition_to_ready(struct megasas_instance *instance, int ocr);
64 int megasas_sriov_start_heartbeat(struct megasas_instance *instance,
69 static void megasas_free_rdpq_fusion(struct megasas_instance *instance);
70 static void megasas_free_reply_fusion(struct megasas_instance *instance);
72 void megasas_configure_queue_sizes(struct megasas_instance *instance);
73 static void megasas_fusion_crash_dump(struct megasas_instance *instance);
78 * @instance: adapter's soft state
88 megasas_adp_reset_wait_for_ready(struct megasas_instance *instance, in megasas_adp_reset_wait_for_ready() argument
99 dev_info(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
103 pci_cfg_access_lock(instance->pdev); in megasas_adp_reset_wait_for_ready()
106 if (instance->instancet->adp_reset in megasas_adp_reset_wait_for_ready()
107 (instance, instance->reg_set)) in megasas_adp_reset_wait_for_ready()
112 if (megasas_transition_to_ready(instance, ocr_context)) { in megasas_adp_reset_wait_for_ready()
113 dev_warn(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
115 instance->host->host_no); in megasas_adp_reset_wait_for_ready()
122 dev_info(&instance->pdev->dev, in megasas_adp_reset_wait_for_ready()
126 pci_cfg_access_unlock(instance->pdev); in megasas_adp_reset_wait_for_ready()
134 * @instance: adapter's soft instance
143 (struct megasas_instance *instance, dma_addr_t start_addr, size_t size) in megasas_check_same_4gb_region() argument
150 dev_err(&instance->pdev->dev, in megasas_check_same_4gb_region()
162 * @instance: adapter's soft instance
165 megasas_enable_intr_fusion(struct megasas_instance *instance) in megasas_enable_intr_fusion() argument
168 regs = instance->reg_set; in megasas_enable_intr_fusion()
170 instance->mask_interrupts = 0; in megasas_enable_intr_fusion()
178 dev_info(&instance->pdev->dev, "%s is called outbound_intr_mask:0x%08x\n", in megasas_enable_intr_fusion()
184 * @instance: adapter's soft instance
187 megasas_disable_intr_fusion(struct megasas_instance *instance) in megasas_disable_intr_fusion() argument
191 regs = instance->reg_set; in megasas_disable_intr_fusion()
192 instance->mask_interrupts = 1; in megasas_disable_intr_fusion()
196 dev_info(&instance->pdev->dev, "%s is called outbound_intr_mask:0x%08x\n", in megasas_disable_intr_fusion()
201 megasas_clear_intr_fusion(struct megasas_instance *instance) in megasas_clear_intr_fusion() argument
205 regs = instance->reg_set; in megasas_clear_intr_fusion()
209 status = megasas_readl(instance, in megasas_clear_intr_fusion()
225 * @instance: Adapter soft state
231 *instance, u32 blk_tag) in megasas_get_cmd_fusion()
235 fusion = instance->ctrl_context; in megasas_get_cmd_fusion()
241 * @instance: Adapter soft state
244 inline void megasas_return_cmd_fusion(struct megasas_instance *instance, in megasas_return_cmd_fusion() argument
255 * @instance: Adapter soft state
259 megasas_write_64bit_req_desc(struct megasas_instance *instance, in megasas_write_64bit_req_desc() argument
265 writeq(req_data, &instance->reg_set->inbound_low_queue_port); in megasas_write_64bit_req_desc()
268 spin_lock_irqsave(&instance->hba_lock, flags); in megasas_write_64bit_req_desc()
270 &instance->reg_set->inbound_low_queue_port); in megasas_write_64bit_req_desc()
272 &instance->reg_set->inbound_high_queue_port); in megasas_write_64bit_req_desc()
273 spin_unlock_irqrestore(&instance->hba_lock, flags); in megasas_write_64bit_req_desc()
279 * @instance: Adapter soft state
286 megasas_fire_cmd_fusion(struct megasas_instance *instance, in megasas_fire_cmd_fusion() argument
289 if (instance->atomic_desc_support) in megasas_fire_cmd_fusion()
291 &instance->reg_set->inbound_single_queue_port); in megasas_fire_cmd_fusion()
293 megasas_write_64bit_req_desc(instance, req_desc); in megasas_fire_cmd_fusion()
298 * @instance: Adapter soft state
308 megasas_fusion_update_can_queue(struct megasas_instance *instance, int fw_boot_context) in megasas_fusion_update_can_queue() argument
314 if (instance->adapter_type < VENTURA_SERIES) in megasas_fusion_update_can_queue()
316 megasas_readl(instance, in megasas_fusion_update_can_queue()
317 &instance->reg_set->outbound_scratch_pad_2) & 0x00FFFF; in megasas_fusion_update_can_queue()
320 cur_max_fw_cmds = instance->instancet->read_fw_status_reg(instance) & 0x00FFFF; in megasas_fusion_update_can_queue()
323 (instance->instancet->read_fw_status_reg(instance) & 0x00FFFF) - MEGASAS_FUSION_IOCTL_CMDS; in megasas_fusion_update_can_queue()
325 dev_info(&instance->pdev->dev, in megasas_fusion_update_can_queue()
331 if (cur_max_fw_cmds < instance->max_fw_cmds) { in megasas_fusion_update_can_queue()
332 instance->cur_can_queue = in megasas_fusion_update_can_queue()
335 instance->host->can_queue = instance->cur_can_queue; in megasas_fusion_update_can_queue()
336 instance->ldio_threshold = ldio_threshold; in megasas_fusion_update_can_queue()
339 instance->max_fw_cmds = cur_max_fw_cmds; in megasas_fusion_update_can_queue()
340 instance->ldio_threshold = ldio_threshold; in megasas_fusion_update_can_queue()
343 instance->max_fw_cmds = min(instance->max_fw_cmds, in megasas_fusion_update_can_queue()
350 instance->max_fw_cmds = instance->max_fw_cmds-1; in megasas_fusion_update_can_queue()
355 megasas_get_msix_index(struct megasas_instance *instance, in megasas_get_msix_index() argument
368 if (instance->perf_mode == MR_BALANCED_PERF_MODE && in megasas_get_msix_index()
371 mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) / in megasas_get_msix_index()
372 MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start); in megasas_get_msix_index()
373 else if (instance->msix_load_balance) in megasas_get_msix_index()
375 (mega_mod64(atomic64_add_return(1, &instance->total_io_count), in megasas_get_msix_index()
376 instance->msix_vectors)); in megasas_get_msix_index()
379 instance->reply_map[raw_smp_processor_id()]; in megasas_get_msix_index()
384 * @instance: Adapter soft state
387 megasas_free_cmds_fusion(struct megasas_instance *instance) in megasas_free_cmds_fusion() argument
390 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_cmds_fusion()
399 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_free_cmds_fusion()
423 if (instance->is_rdpq) in megasas_free_cmds_fusion()
424 megasas_free_rdpq_fusion(instance); in megasas_free_cmds_fusion()
426 megasas_free_reply_fusion(instance); in megasas_free_cmds_fusion()
430 dma_free_coherent(&instance->pdev->dev, in megasas_free_cmds_fusion()
445 * @instance: Adapter soft state
448 static int megasas_create_sg_sense_fusion(struct megasas_instance *instance) in megasas_create_sg_sense_fusion() argument
457 fusion = instance->ctrl_context; in megasas_create_sg_sense_fusion()
458 max_cmd = instance->max_fw_cmds; in megasas_create_sg_sense_fusion()
459 sense_sz = instance->max_mpt_cmds * SCSI_SENSE_BUFFERSIZE; in megasas_create_sg_sense_fusion()
462 dma_pool_create("mr_sg", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
463 instance->max_chain_frame_sz, in megasas_create_sg_sense_fusion()
467 dma_pool_create("mr_sense", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
471 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
479 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
495 if (!megasas_check_same_4gb_region(instance, fusion->sense_phys_addr, in megasas_create_sg_sense_fusion()
503 dma_pool_create("mr_sense_align", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
507 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
515 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
534 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
541 for (i = max_cmd; i < instance->max_mpt_cmds; i++) { in megasas_create_sg_sense_fusion()
553 megasas_alloc_cmdlist_fusion(struct megasas_instance *instance) in megasas_alloc_cmdlist_fusion() argument
558 fusion = instance->ctrl_context; in megasas_alloc_cmdlist_fusion()
560 max_mpt_cmd = instance->max_mpt_cmds; in megasas_alloc_cmdlist_fusion()
571 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
583 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
593 megasas_alloc_request_fusion(struct megasas_instance *instance) in megasas_alloc_request_fusion() argument
597 fusion = instance->ctrl_context; in megasas_alloc_request_fusion()
601 dma_pool_create("mr_ioreq", &instance->pdev->dev, in megasas_alloc_request_fusion()
605 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
615 if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) { in megasas_alloc_request_fusion()
616 instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT; in megasas_alloc_request_fusion()
618 megasas_configure_queue_sizes(instance); in megasas_alloc_request_fusion()
621 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
627 if (!megasas_check_same_4gb_region(instance, in megasas_alloc_request_fusion()
638 &instance->pdev->dev, in megasas_alloc_request_fusion()
644 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
655 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
662 dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_request_fusion()
666 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
675 megasas_alloc_reply_fusion(struct megasas_instance *instance) in megasas_alloc_reply_fusion() argument
680 fusion = instance->ctrl_context; in megasas_alloc_reply_fusion()
682 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_alloc_reply_fusion()
684 dma_pool_create("mr_reply", &instance->pdev->dev, in megasas_alloc_reply_fusion()
688 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
697 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
702 if (!megasas_check_same_4gb_region(instance, in megasas_alloc_reply_fusion()
713 &instance->pdev->dev, in megasas_alloc_reply_fusion()
719 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
730 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
752 megasas_alloc_rdpq_fusion(struct megasas_instance *instance) in megasas_alloc_rdpq_fusion() argument
762 fusion = instance->ctrl_context; in megasas_alloc_rdpq_fusion()
767 fusion->rdpq_virt = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
771 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
776 msix_count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_alloc_rdpq_fusion()
779 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
783 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
790 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
810 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
826 if (!megasas_check_same_4gb_region(instance, rdpq_chunk_phys[i], in megasas_alloc_rdpq_fusion()
836 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
876 megasas_free_rdpq_fusion(struct megasas_instance *instance) { in megasas_free_rdpq_fusion() argument
881 fusion = instance->ctrl_context; in megasas_free_rdpq_fusion()
895 dma_free_coherent(&instance->pdev->dev, in megasas_free_rdpq_fusion()
901 megasas_free_reply_fusion(struct megasas_instance *instance) { in megasas_free_reply_fusion() argument
905 fusion = instance->ctrl_context; in megasas_free_reply_fusion()
919 * @instance: Adapter soft state
934 megasas_alloc_cmds_fusion(struct megasas_instance *instance) in megasas_alloc_cmds_fusion() argument
944 fusion = instance->ctrl_context; in megasas_alloc_cmds_fusion()
946 if (megasas_alloc_request_fusion(instance)) in megasas_alloc_cmds_fusion()
949 if (instance->is_rdpq) { in megasas_alloc_cmds_fusion()
950 if (megasas_alloc_rdpq_fusion(instance)) in megasas_alloc_cmds_fusion()
953 if (megasas_alloc_reply_fusion(instance)) in megasas_alloc_cmds_fusion()
956 if (megasas_alloc_cmdlist_fusion(instance)) in megasas_alloc_cmds_fusion()
959 dev_info(&instance->pdev->dev, "Configured max firmware commands: %d\n", in megasas_alloc_cmds_fusion()
960 instance->max_fw_cmds); in megasas_alloc_cmds_fusion()
971 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_alloc_cmds_fusion()
978 (i >= instance->max_scsi_cmds && i < instance->max_fw_cmds) ? in megasas_alloc_cmds_fusion()
979 (i - instance->max_scsi_cmds) : in megasas_alloc_cmds_fusion()
981 cmd->instance = instance; in megasas_alloc_cmds_fusion()
991 if (megasas_create_sg_sense_fusion(instance)) in megasas_alloc_cmds_fusion()
997 megasas_free_cmds_fusion(instance); in megasas_alloc_cmds_fusion()
1003 * @instance: Adapter soft state
1010 wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd, in wait_and_poll() argument
1026 status_reg = instance->instancet->read_fw_status_reg(instance) in wait_and_poll()
1043 * @instance: Adapter soft state
1048 megasas_ioc_init_fusion(struct megasas_instance *instance) in megasas_ioc_init_fusion() argument
1066 fusion = instance->ctrl_context; in megasas_ioc_init_fusion()
1074 (instance, &instance->reg_set->outbound_scratch_pad_1); in megasas_ioc_init_fusion()
1078 if (instance->adapter_type == INVADER_SERIES) { in megasas_ioc_init_fusion()
1082 if (instance->consistent_mask_64bit && !cur_fw_64bit_dma_capable) { in megasas_ioc_init_fusion()
1083 dev_err(&instance->pdev->dev, "Driver was operating on 64bit " in megasas_ioc_init_fusion()
1085 megaraid_sas_kill_hba(instance); in megasas_ioc_init_fusion()
1091 if (instance->is_rdpq && !cur_rdpq_mode) { in megasas_ioc_init_fusion()
1092 dev_err(&instance->pdev->dev, "Firmware downgrade *NOT SUPPORTED*" in megasas_ioc_init_fusion()
1101 if ((instance->low_latency_index_start == in megasas_ioc_init_fusion()
1103 instance->perf_mode = MR_BALANCED_PERF_MODE; in megasas_ioc_init_fusion()
1105 dev_info(&instance->pdev->dev, "Performance mode :%s\n", in megasas_ioc_init_fusion()
1106 MEGASAS_PERF_MODE_2STR(instance->perf_mode)); in megasas_ioc_init_fusion()
1108 instance->fw_sync_cache_support = (scratch_pad_1 & in megasas_ioc_init_fusion()
1110 dev_info(&instance->pdev->dev, "FW supports sync cache\t: %s\n", in megasas_ioc_init_fusion()
1111 instance->fw_sync_cache_support ? "Yes" : "No"); in megasas_ioc_init_fusion()
1122 IOCInitMessage->ReplyDescriptorPostQueueAddress = instance->is_rdpq ? in megasas_ioc_init_fusion()
1125 IOCInitMessage->MsgFlags = instance->is_rdpq ? in megasas_ioc_init_fusion()
1129 IOCInitMessage->HostMSIxVectors = instance->msix_vectors; in megasas_ioc_init_fusion()
1149 if (instance->adapter_type >= INVADER_SERIES) in megasas_ioc_init_fusion()
1158 if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN) in megasas_ioc_init_fusion()
1170 if (instance->consistent_mask_64bit) in megasas_ioc_init_fusion()
1177 if (instance->system_info_buf && sys_info) { in megasas_ioc_init_fusion()
1178 memcpy(instance->system_info_buf->systemId, sys_info, in megasas_ioc_init_fusion()
1180 instance->system_info_buf->systemIdLength = in megasas_ioc_init_fusion()
1182 init_frame->system_info_lo = cpu_to_le32(lower_32_bits(instance->system_info_h)); in megasas_ioc_init_fusion()
1183 init_frame->system_info_hi = cpu_to_le32(upper_32_bits(instance->system_info_h)); in megasas_ioc_init_fusion()
1196 switch (instance->perf_mode) { in megasas_ioc_init_fusion()
1199 cpu_to_le16(~(~0 << instance->low_latency_index_start/8)); in megasas_ioc_init_fusion()
1203 cpu_to_le16(~(~0 << instance->msix_vectors/8)); in megasas_ioc_init_fusion()
1217 instance->instancet->disable_intr(instance); in megasas_ioc_init_fusion()
1220 if (megasas_readl(instance, &instance->reg_set->doorbell) & 1) in megasas_ioc_init_fusion()
1227 megasas_write_64bit_req_desc(instance, &req_desc); in megasas_ioc_init_fusion()
1229 wait_and_poll(instance, cmd, MFI_IO_TIMEOUT_SECS); in megasas_ioc_init_fusion()
1237 if (instance->adapter_type >= AERO_SERIES) { in megasas_ioc_init_fusion()
1239 (instance, &instance->reg_set->outbound_scratch_pad_1); in megasas_ioc_init_fusion()
1241 instance->atomic_desc_support = in megasas_ioc_init_fusion()
1244 dev_info(&instance->pdev->dev, "FW supports atomic descriptor\t: %s\n", in megasas_ioc_init_fusion()
1245 instance->atomic_desc_support ? "Yes" : "No"); in megasas_ioc_init_fusion()
1251 dev_err(&instance->pdev->dev, in megasas_ioc_init_fusion()
1253 instance->host->host_no); in megasas_ioc_init_fusion()
1260 * @instance: Adapter soft state
1264 * issue command and return. If it is first instance of jbod map
1268 megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend) { in megasas_sync_pd_seq_num() argument
1273 struct fusion_context *fusion = instance->ctrl_context; in megasas_sync_pd_seq_num()
1277 pd_sync = (void *)fusion->pd_seq_sync[(instance->pd_seq_map_id & 1)]; in megasas_sync_pd_seq_num()
1278 pd_seq_h = fusion->pd_seq_phys[(instance->pd_seq_map_id & 1)]; in megasas_sync_pd_seq_num()
1281 cmd = megasas_get_cmd(instance); in megasas_sync_pd_seq_num()
1283 dev_err(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1297 instance->jbod_seq_cmd = cmd; in megasas_sync_pd_seq_num()
1310 megasas_set_dma_settings(instance, dcmd, pd_seq_h, pd_seq_map_sz); in megasas_sync_pd_seq_num()
1313 instance->instancet->issue_dcmd(instance, cmd); in megasas_sync_pd_seq_num()
1318 if (!instance->mask_interrupts) in megasas_sync_pd_seq_num()
1319 ret = megasas_issue_blocked_cmd(instance, cmd, in megasas_sync_pd_seq_num()
1322 ret = megasas_issue_polled(instance, cmd); in megasas_sync_pd_seq_num()
1325 dev_warn(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1332 dev_warn(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1337 instance->pd_seq_map_id++; in megasas_sync_pd_seq_num()
1339 megasas_return_cmd(instance, cmd); in megasas_sync_pd_seq_num()
1345 * @instance: Adapter soft state
1359 megasas_get_ld_map_info(struct megasas_instance *instance) in megasas_get_ld_map_info() argument
1369 cmd = megasas_get_cmd(instance); in megasas_get_ld_map_info()
1372 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for map info\n"); in megasas_get_ld_map_info()
1376 fusion = instance->ctrl_context; in megasas_get_ld_map_info()
1379 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1387 ci = (void *) fusion->ld_map[(instance->map_id & 1)]; in megasas_get_ld_map_info()
1388 ci_h = fusion->ld_map_phys[(instance->map_id & 1)]; in megasas_get_ld_map_info()
1391 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to alloc mem for ld_map_info\n"); in megasas_get_ld_map_info()
1392 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1407 megasas_set_dma_settings(instance, dcmd, ci_h, size_map_info); in megasas_get_ld_map_info()
1409 if (!instance->mask_interrupts) in megasas_get_ld_map_info()
1410 ret = megasas_issue_blocked_cmd(instance, cmd, in megasas_get_ld_map_info()
1413 ret = megasas_issue_polled(instance, cmd); in megasas_get_ld_map_info()
1416 dev_warn(&instance->pdev->dev, in megasas_get_ld_map_info()
1420 megasas_return_cmd(instance, cmd); in megasas_get_ld_map_info()
1426 megasas_get_map_info(struct megasas_instance *instance) in megasas_get_map_info() argument
1428 struct fusion_context *fusion = instance->ctrl_context; in megasas_get_map_info()
1431 if (!megasas_get_ld_map_info(instance)) { in megasas_get_map_info()
1432 if (MR_ValidateMapInfo(instance, instance->map_id)) { in megasas_get_map_info()
1442 * @instance: Adapter soft state
1449 megasas_sync_map_info(struct megasas_instance *instance) in megasas_sync_map_info() argument
1463 cmd = megasas_get_cmd(instance); in megasas_sync_map_info()
1466 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for sync info\n"); in megasas_sync_map_info()
1470 fusion = instance->ctrl_context; in megasas_sync_map_info()
1473 megasas_return_cmd(instance, cmd); in megasas_sync_map_info()
1477 map = fusion->ld_drv_map[instance->map_id & 1]; in megasas_sync_map_info()
1486 fusion->ld_map[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1489 ci_h = fusion->ld_map_phys[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1512 megasas_set_dma_settings(instance, dcmd, ci_h, size_map_info); in megasas_sync_map_info()
1514 instance->map_update_cmd = cmd; in megasas_sync_map_info()
1516 instance->instancet->issue_dcmd(instance, cmd); in megasas_sync_map_info()
1523 * @instance: per adapter object
1528 megasas_display_intel_branding(struct megasas_instance *instance) in megasas_display_intel_branding() argument
1530 if (instance->pdev->subsystem_vendor != PCI_VENDOR_ID_INTEL) in megasas_display_intel_branding()
1533 switch (instance->pdev->device) { in megasas_display_intel_branding()
1535 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1537 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1538 instance->host->host_no, 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()
1552 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1553 instance->host->host_no, in megasas_display_intel_branding()
1561 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1563 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1564 instance->host->host_no, in megasas_display_intel_branding()
1568 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1569 instance->host->host_no, in megasas_display_intel_branding()
1578 switch (instance->pdev->subsystem_device) { in megasas_display_intel_branding()
1580 dev_info(&instance->pdev->dev, "scsi host %d: %s\n", in megasas_display_intel_branding()
1581 instance->host->host_no, in megasas_display_intel_branding()
1595 * @instance: Adapter soft state
1600 static inline int megasas_allocate_raid_maps(struct megasas_instance *instance) in megasas_allocate_raid_maps() argument
1605 fusion = instance->ctrl_context; in megasas_allocate_raid_maps()
1620 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1630 fusion->ld_map[i] = dma_alloc_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1635 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1647 dma_free_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1671 * @instance: Adapter soft state
1675 void megasas_configure_queue_sizes(struct megasas_instance *instance) in megasas_configure_queue_sizes() argument
1680 fusion = instance->ctrl_context; in megasas_configure_queue_sizes()
1681 max_cmd = instance->max_fw_cmds; in megasas_configure_queue_sizes()
1683 if (instance->adapter_type >= VENTURA_SERIES) in megasas_configure_queue_sizes()
1684 instance->max_mpt_cmds = instance->max_fw_cmds * RAID_1_PEER_CMDS; in megasas_configure_queue_sizes()
1686 instance->max_mpt_cmds = instance->max_fw_cmds; in megasas_configure_queue_sizes()
1688 instance->max_scsi_cmds = instance->max_fw_cmds - instance->max_mfi_cmds; in megasas_configure_queue_sizes()
1689 instance->cur_can_queue = instance->max_scsi_cmds; in megasas_configure_queue_sizes()
1690 instance->host->can_queue = instance->cur_can_queue; in megasas_configure_queue_sizes()
1695 instance->max_mpt_cmds; in megasas_configure_queue_sizes()
1700 * (instance->max_mpt_cmds + 1)); /* Extra 1 for SMID 0 */ in megasas_configure_queue_sizes()
1703 static int megasas_alloc_ioc_init_frame(struct megasas_instance *instance) in megasas_alloc_ioc_init_frame() argument
1708 fusion = instance->ctrl_context; in megasas_alloc_ioc_init_frame()
1713 dev_err(&instance->pdev->dev, "Failed from func: %s line: %d\n", in megasas_alloc_ioc_init_frame()
1718 cmd->frame = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_ioc_init_frame()
1723 dev_err(&instance->pdev->dev, "Failed from func: %s line: %d\n", in megasas_alloc_ioc_init_frame()
1735 * @instance: Adapter soft state
1737 static inline void megasas_free_ioc_init_cmd(struct megasas_instance *instance) in megasas_free_ioc_init_cmd() argument
1741 fusion = instance->ctrl_context; in megasas_free_ioc_init_cmd()
1744 dma_free_coherent(&instance->pdev->dev, in megasas_free_ioc_init_cmd()
1754 * @instance: Adapter soft state
1759 megasas_init_adapter_fusion(struct megasas_instance *instance) in megasas_init_adapter_fusion() argument
1766 fusion = instance->ctrl_context; in megasas_init_adapter_fusion()
1768 megasas_fusion_update_can_queue(instance, PROBE_CONTEXT); in megasas_init_adapter_fusion()
1773 instance->max_mfi_cmds = in megasas_init_adapter_fusion()
1776 megasas_configure_queue_sizes(instance); in megasas_init_adapter_fusion()
1778 scratch_pad_1 = megasas_readl(instance, in megasas_init_adapter_fusion()
1779 &instance->reg_set->outbound_scratch_pad_1); in megasas_init_adapter_fusion()
1787 instance->max_chain_frame_sz = in megasas_init_adapter_fusion()
1791 instance->max_chain_frame_sz = in megasas_init_adapter_fusion()
1795 if (instance->max_chain_frame_sz < MEGASAS_CHAIN_FRAME_SZ_MIN) { in megasas_init_adapter_fusion()
1796 dev_warn(&instance->pdev->dev, "frame size %d invalid, fall back to legacy max frame size %d\n", in megasas_init_adapter_fusion()
1797 instance->max_chain_frame_sz, in megasas_init_adapter_fusion()
1799 instance->max_chain_frame_sz = MEGASAS_CHAIN_FRAME_SZ_MIN; in megasas_init_adapter_fusion()
1807 instance->max_chain_frame_sz in megasas_init_adapter_fusion()
1810 instance->max_num_sge = in megasas_init_adapter_fusion()
1822 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_init_adapter_fusion()
1830 instance->max_scsi_cmds = instance->max_fw_cmds - in megasas_init_adapter_fusion()
1833 sema_init(&instance->ioctl_sem, MEGASAS_FUSION_IOCTL_CMDS); in megasas_init_adapter_fusion()
1835 if (megasas_alloc_ioc_init_frame(instance)) in megasas_init_adapter_fusion()
1842 if (megasas_alloc_cmds(instance)) in megasas_init_adapter_fusion()
1844 if (megasas_alloc_cmds_fusion(instance)) in megasas_init_adapter_fusion()
1847 if (megasas_ioc_init_fusion(instance)) { in megasas_init_adapter_fusion()
1848 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_init_adapter_fusion()
1853 (instance, true, 0) == FAILED) in megasas_init_adapter_fusion()
1856 if (megasas_ioc_init_fusion(instance)) in megasas_init_adapter_fusion()
1863 megasas_display_intel_branding(instance); in megasas_init_adapter_fusion()
1864 if (megasas_get_ctrl_info(instance)) { in megasas_init_adapter_fusion()
1865 dev_err(&instance->pdev->dev, in megasas_init_adapter_fusion()
1871 instance->flag_ieee = 1; in megasas_init_adapter_fusion()
1872 instance->r1_ldio_hint_default = MR_R1_LDIO_PIGGYBACK_DEFAULT; in megasas_init_adapter_fusion()
1873 instance->threshold_reply_count = instance->max_fw_cmds / 4; in megasas_init_adapter_fusion()
1876 if (megasas_allocate_raid_maps(instance)) in megasas_init_adapter_fusion()
1879 if (!megasas_get_map_info(instance)) in megasas_init_adapter_fusion()
1880 megasas_sync_map_info(instance); in megasas_init_adapter_fusion()
1885 megasas_free_cmds_fusion(instance); in megasas_init_adapter_fusion()
1887 megasas_free_cmds(instance); in megasas_init_adapter_fusion()
1889 megasas_free_ioc_init_cmd(instance); in megasas_init_adapter_fusion()
1901 struct megasas_instance *instance = in megasas_fault_detect_work() local
1907 fw_state = instance->instancet->read_fw_status_reg(instance) & in megasas_fault_detect_work()
1911 dma_state = instance->instancet->read_fw_status_reg(instance) & in megasas_fault_detect_work()
1914 if (instance->crash_dump_drv_support && in megasas_fault_detect_work()
1915 instance->crash_dump_app_support && dma_state) { in megasas_fault_detect_work()
1916 megasas_fusion_crash_dump(instance); in megasas_fault_detect_work()
1918 if (instance->unload == 0) { in megasas_fault_detect_work()
1919 status = megasas_reset_fusion(instance->host, 0); in megasas_fault_detect_work()
1921 dev_err(&instance->pdev->dev, in megasas_fault_detect_work()
1930 if (instance->fw_fault_work_q) in megasas_fault_detect_work()
1931 queue_delayed_work(instance->fw_fault_work_q, in megasas_fault_detect_work()
1932 &instance->fw_fault_work, in megasas_fault_detect_work()
1937 megasas_fusion_start_watchdog(struct megasas_instance *instance) in megasas_fusion_start_watchdog() argument
1940 if (instance->fw_fault_work_q) in megasas_fusion_start_watchdog()
1943 INIT_DELAYED_WORK(&instance->fw_fault_work, megasas_fault_detect_work); in megasas_fusion_start_watchdog()
1945 snprintf(instance->fault_handler_work_q_name, in megasas_fusion_start_watchdog()
1946 sizeof(instance->fault_handler_work_q_name), in megasas_fusion_start_watchdog()
1947 "poll_megasas%d_status", instance->host->host_no); in megasas_fusion_start_watchdog()
1949 instance->fw_fault_work_q = in megasas_fusion_start_watchdog()
1950 create_singlethread_workqueue(instance->fault_handler_work_q_name); in megasas_fusion_start_watchdog()
1951 if (!instance->fw_fault_work_q) { in megasas_fusion_start_watchdog()
1952 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_fusion_start_watchdog()
1957 queue_delayed_work(instance->fw_fault_work_q, in megasas_fusion_start_watchdog()
1958 &instance->fw_fault_work, in megasas_fusion_start_watchdog()
1965 megasas_fusion_stop_watchdog(struct megasas_instance *instance) in megasas_fusion_stop_watchdog() argument
1969 if (instance->fw_fault_work_q) { in megasas_fusion_stop_watchdog()
1970 wq = instance->fw_fault_work_q; in megasas_fusion_stop_watchdog()
1971 instance->fw_fault_work_q = NULL; in megasas_fusion_stop_watchdog()
1972 if (!cancel_delayed_work_sync(&instance->fw_fault_work)) in megasas_fusion_stop_watchdog()
2052 * @instance: Adapter soft state
2060 megasas_is_prp_possible(struct megasas_instance *instance, in megasas_is_prp_possible() argument
2068 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_is_prp_possible()
2098 * @instance: Adapter soft state
2108 megasas_make_prp_nvme(struct megasas_instance *instance, struct scsi_cmnd *scmd, in megasas_make_prp_nvme() argument
2122 u32 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_make_prp_nvme()
2125 build_prp = megasas_is_prp_possible(instance, scmd, sge_count); in megasas_make_prp_nvme()
2145 memset(ptr_sgl, 0, instance->max_chain_frame_sz); in megasas_make_prp_nvme()
2223 * @instance: Adapter soft state
2231 megasas_make_sgl_fusion(struct megasas_instance *instance, in megasas_make_sgl_fusion() argument
2240 fusion = instance->ctrl_context; in megasas_make_sgl_fusion()
2242 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2252 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2262 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2278 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2289 memset(sgl_ptr, 0, instance->max_chain_frame_sz); in megasas_make_sgl_fusion()
2297 * @instance: Soft instance of controller
2308 int megasas_make_sgl(struct megasas_instance *instance, struct scsi_cmnd *scp, in megasas_make_sgl() argument
2317 if ((sge_count > instance->max_num_sge) || (sge_count <= 0)) in megasas_make_sgl()
2324 build_prp = megasas_make_prp_nvme(instance, scp, sgl_chain64, in megasas_make_sgl()
2328 megasas_make_sgl_fusion(instance, scp, sgl_chain64, in megasas_make_sgl()
2516 * @instance: Adapter soft state
2523 static void megasas_stream_detect(struct megasas_instance *instance, in megasas_stream_detect() argument
2527 struct fusion_context *fusion = instance->ctrl_context; in megasas_stream_detect()
2679 * @instance: Adapter soft state
2687 megasas_build_ldio_fusion(struct megasas_instance *instance, in megasas_build_ldio_fusion() argument
2708 fusion = instance->ctrl_context; in megasas_build_ldio_fusion()
2784 local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_ldio_fusion()
2787 if (ld < instance->fw_supported_vd_count) in megasas_build_ldio_fusion()
2794 if (MR_BuildRaidContext(instance, &io_info, rctx, in megasas_build_ldio_fusion()
2799 megasas_get_msix_index(instance, scp, cmd, io_info.data_arms); in megasas_build_ldio_fusion()
2801 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2813 if (atomic_inc_return(&instance->fw_outstanding) > in megasas_build_ldio_fusion()
2814 (instance->host->can_queue)) { in megasas_build_ldio_fusion()
2816 atomic_dec(&instance->fw_outstanding); in megasas_build_ldio_fusion()
2821 atomic_dec(&instance->fw_outstanding); in megasas_build_ldio_fusion()
2824 instance->r1_ldio_hint_default); in megasas_build_ldio_fusion()
2830 spin_lock_irqsave(&instance->stream_lock, in megasas_build_ldio_fusion()
2832 megasas_stream_detect(instance, cmd, &io_info); in megasas_build_ldio_fusion()
2833 spin_unlock_irqrestore(&instance->stream_lock, in megasas_build_ldio_fusion()
2859 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2866 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2877 get_updated_dev_handle(instance, in megasas_build_ldio_fusion()
2882 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2890 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2897 instance->dev_handle = !(instance->dev_handle); in megasas_build_ldio_fusion()
2899 local_map_ptr->raidMap.devHndlInfo[io_info.pd_after_lb].devHandle[instance->dev_handle]; in megasas_build_ldio_fusion()
2913 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2924 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2937 * @instance: Adapter soft state
2943 static void megasas_build_ld_nonrw_fusion(struct megasas_instance *instance, in megasas_build_ld_nonrw_fusion() argument
2950 struct fusion_context *fusion = instance->ctrl_context; in megasas_build_ld_nonrw_fusion()
2960 local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_ld_nonrw_fusion()
2970 device_id < instance->fw_supported_vd_count)) { in megasas_build_ld_nonrw_fusion()
2973 if (ld >= instance->fw_supported_vd_count - 1) in megasas_build_ld_nonrw_fusion()
2996 if (instance->adapter_type < VENTURA_SERIES) in megasas_build_ld_nonrw_fusion()
3025 * @instance: Adapter soft state
3033 megasas_build_syspd_fusion(struct megasas_instance *instance, in megasas_build_syspd_fusion() argument
3046 struct fusion_context *fusion = instance->ctrl_context; in megasas_build_syspd_fusion()
3047 pd_sync = (void *)fusion->pd_seq_sync[(instance->pd_seq_map_id - 1) & 1]; in megasas_build_syspd_fusion()
3067 if (instance->support_seqnum_jbod_fp) { in megasas_build_syspd_fusion()
3068 if (instance->use_seqnum_jbod_fp && in megasas_build_syspd_fusion()
3069 instance->pd_list[pd_index].driveType == TYPE_DISK) { in megasas_build_syspd_fusion()
3072 if (instance->support_morethan256jbod) in megasas_build_syspd_fusion()
3083 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_syspd_fusion()
3110 fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_syspd_fusion()
3120 megasas_get_msix_index(instance, scmd, cmd, 1); in megasas_build_syspd_fusion()
3141 if (instance->adapter_type >= INVADER_SERIES) in megasas_build_syspd_fusion()
3153 * @instance: Adapter soft state
3161 megasas_build_io_fusion(struct megasas_instance *instance, in megasas_build_io_fusion() argument
3192 megasas_build_ldio_fusion(instance, scp, cmd); in megasas_build_io_fusion()
3195 megasas_build_ld_nonrw_fusion(instance, scp, cmd); in megasas_build_io_fusion()
3198 megasas_build_syspd_fusion(instance, scp, cmd, true); in megasas_build_io_fusion()
3201 if (instance->secure_jbod_support || in megasas_build_io_fusion()
3203 megasas_build_syspd_fusion(instance, scp, cmd, false); in megasas_build_io_fusion()
3205 megasas_build_syspd_fusion(instance, scp, cmd, true); in megasas_build_io_fusion()
3215 sge_count = megasas_make_sgl(instance, scp, cmd); in megasas_build_io_fusion()
3217 if (sge_count > instance->max_num_sge || (sge_count < 0)) { in megasas_build_io_fusion()
3218 dev_err(&instance->pdev->dev, in megasas_build_io_fusion()
3220 __func__, __LINE__, sge_count, instance->max_num_sge); in megasas_build_io_fusion()
3224 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_io_fusion()
3258 megasas_get_request_descriptor(struct megasas_instance *instance, u16 index) in megasas_get_request_descriptor() argument
3263 fusion = instance->ctrl_context; in megasas_get_request_descriptor()
3274 static void megasas_prepare_secondRaid1_IO(struct megasas_instance *instance, in megasas_prepare_secondRaid1_IO() argument
3280 fusion = instance->ctrl_context; in megasas_prepare_secondRaid1_IO()
3291 req_desc2 = megasas_get_request_descriptor(instance, in megasas_prepare_secondRaid1_IO()
3315 * @instance: Adapter soft state
3319 megasas_build_and_issue_cmd_fusion(struct megasas_instance *instance, in megasas_build_and_issue_cmd_fusion() argument
3327 instance->ldio_threshold && in megasas_build_and_issue_cmd_fusion()
3328 (atomic_inc_return(&instance->ldio_outstanding) > in megasas_build_and_issue_cmd_fusion()
3329 instance->ldio_threshold)) { in megasas_build_and_issue_cmd_fusion()
3330 atomic_dec(&instance->ldio_outstanding); in megasas_build_and_issue_cmd_fusion()
3334 if (atomic_inc_return(&instance->fw_outstanding) > in megasas_build_and_issue_cmd_fusion()
3335 instance->host->can_queue) { in megasas_build_and_issue_cmd_fusion()
3336 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3340 cmd = megasas_get_cmd_fusion(instance, scmd->request->tag); in megasas_build_and_issue_cmd_fusion()
3343 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3349 req_desc = megasas_get_request_descriptor(instance, index-1); in megasas_build_and_issue_cmd_fusion()
3354 if (megasas_build_io_fusion(instance, scmd, cmd)) { in megasas_build_and_issue_cmd_fusion()
3355 megasas_return_cmd_fusion(instance, cmd); in megasas_build_and_issue_cmd_fusion()
3356 dev_err(&instance->pdev->dev, "Error building command\n"); in megasas_build_and_issue_cmd_fusion()
3358 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3367 dev_err(&instance->pdev->dev, "The chain offset value is not " in megasas_build_and_issue_cmd_fusion()
3380 r1_cmd = megasas_get_cmd_fusion(instance, in megasas_build_and_issue_cmd_fusion()
3381 (scmd->request->tag + instance->max_fw_cmds)); in megasas_build_and_issue_cmd_fusion()
3382 megasas_prepare_secondRaid1_IO(instance, cmd, r1_cmd); in megasas_build_and_issue_cmd_fusion()
3390 megasas_fire_cmd_fusion(instance, req_desc); in megasas_build_and_issue_cmd_fusion()
3393 megasas_fire_cmd_fusion(instance, r1_cmd->request_desc); in megasas_build_and_issue_cmd_fusion()
3402 * @instance: Adapter soft state
3407 megasas_complete_r1_command(struct megasas_instance *instance, in megasas_complete_r1_command() argument
3419 fusion = instance->ctrl_context; in megasas_complete_r1_command()
3441 megasas_return_cmd_fusion(instance, r1_cmd); in megasas_complete_r1_command()
3444 if (instance->ldio_threshold && in megasas_complete_r1_command()
3446 atomic_dec(&instance->ldio_outstanding); in megasas_complete_r1_command()
3448 megasas_return_cmd_fusion(instance, cmd); in megasas_complete_r1_command()
3456 * @instance: Adapter soft state
3463 complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex, in complete_cmd_fusion() argument
3482 fusion = instance->ctrl_context; in complete_cmd_fusion()
3484 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in complete_cmd_fusion()
3522 dev_dbg(&instance->pdev->dev, "TM completion:" in complete_cmd_fusion()
3539 atomic_dec(&instance->fw_outstanding); in complete_cmd_fusion()
3544 if (instance->ldio_threshold && in complete_cmd_fusion()
3546 atomic_dec(&instance->ldio_outstanding); in complete_cmd_fusion()
3548 megasas_return_cmd_fusion(instance, cmd_fusion); in complete_cmd_fusion()
3552 megasas_complete_r1_command(instance, cmd_fusion); in complete_cmd_fusion()
3555 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in complete_cmd_fusion()
3561 megasas_return_cmd(instance, cmd_mfi); in complete_cmd_fusion()
3563 megasas_complete_cmd(instance, cmd_mfi, DID_OK); in complete_cmd_fusion()
3597 if (threshold_reply_count >= instance->threshold_reply_count) { in complete_cmd_fusion()
3598 if (instance->msix_combined) in complete_cmd_fusion()
3601 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3605 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3620 if (instance->msix_combined) in complete_cmd_fusion()
3623 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3627 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3628 megasas_check_and_restore_queue_depth(instance); in complete_cmd_fusion()
3635 * @instance: Adapter soft state
3637 static void megasas_enable_irq_poll(struct megasas_instance *instance) in megasas_enable_irq_poll() argument
3642 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_enable_irq_poll()
3645 irq_ctx = &instance->irq_context[i]; in megasas_enable_irq_poll()
3657 struct megasas_instance *instance = in megasas_sync_irqs() local
3661 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_sync_irqs()
3664 synchronize_irq(pci_irq_vector(instance->pdev, i)); in megasas_sync_irqs()
3665 irq_ctx = &instance->irq_context[i]; in megasas_sync_irqs()
3670 complete_cmd_fusion(instance, irq_ctx->MSIxIndex, irq_ctx); in megasas_sync_irqs()
3686 struct megasas_instance *instance; in megasas_irqpoll() local
3690 instance = irq_ctx->instance; in megasas_irqpoll()
3697 num_entries = complete_cmd_fusion(instance, irq_ctx->MSIxIndex, irq_ctx); in megasas_irqpoll()
3702 complete_cmd_fusion(instance, irq_ctx->MSIxIndex, irq_ctx); in megasas_irqpoll()
3717 struct megasas_instance *instance = in megasas_complete_cmd_dpc_fusion() local
3722 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_complete_cmd_dpc_fusion()
3725 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in megasas_complete_cmd_dpc_fusion()
3729 irq_ctx = &instance->irq_context[MSIxIndex]; in megasas_complete_cmd_dpc_fusion()
3730 complete_cmd_fusion(instance, MSIxIndex, irq_ctx); in megasas_complete_cmd_dpc_fusion()
3742 struct megasas_instance *instance = irq_context->instance; in megasas_isr_fusion() local
3745 if (instance->mask_interrupts) in megasas_isr_fusion()
3751 if (!instance->msix_vectors) { in megasas_isr_fusion()
3752 mfiStatus = instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3758 if (test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) { in megasas_isr_fusion()
3759 instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3763 return complete_cmd_fusion(instance, irq_context->MSIxIndex, irq_context) in megasas_isr_fusion()
3769 * @instance: Adapter soft state
3774 build_mpt_mfi_pass_thru(struct megasas_instance *instance, in build_mpt_mfi_pass_thru() argument
3783 fusion = instance->ctrl_context; in build_mpt_mfi_pass_thru()
3785 cmd = megasas_get_cmd_fusion(instance, in build_mpt_mfi_pass_thru()
3786 instance->max_scsi_cmds + mfi_cmd->index); in build_mpt_mfi_pass_thru()
3802 if (instance->adapter_type >= INVADER_SERIES) { in build_mpt_mfi_pass_thru()
3822 mpi25_ieee_chain->Length = cpu_to_le32(instance->mfi_frame_size); in build_mpt_mfi_pass_thru()
3827 * @instance: Adapter soft state
3832 build_mpt_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd) in build_mpt_cmd() argument
3837 build_mpt_mfi_pass_thru(instance, cmd); in build_mpt_cmd()
3840 req_desc = megasas_get_request_descriptor(instance, index - 1); in build_mpt_cmd()
3853 * @instance: Adapter soft state
3858 megasas_issue_dcmd_fusion(struct megasas_instance *instance, in megasas_issue_dcmd_fusion() argument
3863 req_desc = build_mpt_cmd(instance, cmd); in megasas_issue_dcmd_fusion()
3865 megasas_fire_cmd_fusion(instance, req_desc); in megasas_issue_dcmd_fusion()
3871 * @instance: Adapter soft state
3874 megasas_release_fusion(struct megasas_instance *instance) in megasas_release_fusion() argument
3876 megasas_free_ioc_init_cmd(instance); in megasas_release_fusion()
3877 megasas_free_cmds(instance); in megasas_release_fusion()
3878 megasas_free_cmds_fusion(instance); in megasas_release_fusion()
3880 iounmap(instance->reg_set); in megasas_release_fusion()
3882 pci_release_selected_regions(instance->pdev, 1<<instance->bar); in megasas_release_fusion()
3887 * @instance: Adapter soft state
3890 megasas_read_fw_status_reg_fusion(struct megasas_instance *instance) in megasas_read_fw_status_reg_fusion() argument
3892 return megasas_readl(instance, &instance->reg_set->outbound_scratch_pad_0); in megasas_read_fw_status_reg_fusion()
3897 * @instance: Controller's soft instance
3901 megasas_alloc_host_crash_buffer(struct megasas_instance *instance) in megasas_alloc_host_crash_buffer() argument
3906 instance->crash_buf[i] = vzalloc(CRASH_DMA_BUF_SIZE); in megasas_alloc_host_crash_buffer()
3907 if (!instance->crash_buf[i]) { in megasas_alloc_host_crash_buffer()
3908 dev_info(&instance->pdev->dev, "Firmware crash dump " in megasas_alloc_host_crash_buffer()
3913 instance->drv_buf_alloc = i; in megasas_alloc_host_crash_buffer()
3918 * @instance: Controller's soft instance
3921 megasas_free_host_crash_buffer(struct megasas_instance *instance) in megasas_free_host_crash_buffer() argument
3924 for (i = 0; i < instance->drv_buf_alloc; i++) { in megasas_free_host_crash_buffer()
3925 if (instance->crash_buf[i]) in megasas_free_host_crash_buffer()
3926 vfree(instance->crash_buf[i]); in megasas_free_host_crash_buffer()
3928 instance->drv_buf_index = 0; in megasas_free_host_crash_buffer()
3929 instance->drv_buf_alloc = 0; in megasas_free_host_crash_buffer()
3930 instance->fw_crash_state = UNAVAILABLE; in megasas_free_host_crash_buffer()
3931 instance->fw_crash_buffer_size = 0; in megasas_free_host_crash_buffer()
3936 * @instance: Controller's soft instance
3940 megasas_adp_reset_fusion(struct megasas_instance *instance, in megasas_adp_reset_fusion() argument
3946 writel(MPI2_WRSEQ_FLUSH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3947 writel(MPI2_WRSEQ_1ST_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3948 writel(MPI2_WRSEQ_2ND_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3949 writel(MPI2_WRSEQ_3RD_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3950 writel(MPI2_WRSEQ_4TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3951 writel(MPI2_WRSEQ_5TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3952 writel(MPI2_WRSEQ_6TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3955 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3959 host_diag = megasas_readl(instance, in megasas_adp_reset_fusion()
3960 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3962 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
3973 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3977 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3981 host_diag = megasas_readl(instance, in megasas_adp_reset_fusion()
3982 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3984 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
3993 abs_state = instance->instancet->read_fw_status_reg(instance) in megasas_adp_reset_fusion()
3999 abs_state = instance->instancet-> in megasas_adp_reset_fusion()
4000 read_fw_status_reg(instance) & MFI_STATE_MASK; in megasas_adp_reset_fusion()
4003 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
4014 * @instance: Controller's soft instance
4018 megasas_check_reset_fusion(struct megasas_instance *instance, in megasas_check_reset_fusion() argument
4026 * @instance: Soft instance of adapter
4028 static inline void megasas_trigger_snap_dump(struct megasas_instance *instance) in megasas_trigger_snap_dump() argument
4033 if (!instance->disableOnlineCtrlReset) { in megasas_trigger_snap_dump()
4034 dev_info(&instance->pdev->dev, "Trigger snap dump\n"); in megasas_trigger_snap_dump()
4036 &instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4037 readl(&instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4040 for (j = 0; j < instance->snapdump_wait_time; j++) { in megasas_trigger_snap_dump()
4041 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_trigger_snap_dump()
4044 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_trigger_snap_dump()
4056 megasas_wait_for_outstanding_fusion(struct megasas_instance *instance, in megasas_wait_for_outstanding_fusion() argument
4065 (resetwaittime - instance->snapdump_wait_time)); in megasas_wait_for_outstanding_fusion()
4068 dev_info(&instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4070 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4071 if (instance->snapdump_wait_time) in megasas_wait_for_outstanding_fusion()
4072 megasas_trigger_snap_dump(instance); in megasas_wait_for_outstanding_fusion()
4079 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_wait_for_outstanding_fusion()
4082 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4086 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4087 if (instance->requestorId && reason) { in megasas_wait_for_outstanding_fusion()
4088 dev_warn(&instance->pdev->dev, "SR-IOV Found FW in FAULT" in megasas_wait_for_outstanding_fusion()
4091 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4101 if (instance->requestorId && !reason) { in megasas_wait_for_outstanding_fusion()
4107 if (instance->requestorId && (reason == SCSIIO_TIMEOUT_OCR)) { in megasas_wait_for_outstanding_fusion()
4108 if (instance->hb_host_mem->HB.fwCounter != in megasas_wait_for_outstanding_fusion()
4109 instance->hb_host_mem->HB.driverCounter) { in megasas_wait_for_outstanding_fusion()
4110 instance->hb_host_mem->HB.driverCounter = in megasas_wait_for_outstanding_fusion()
4111 instance->hb_host_mem->HB.fwCounter; in megasas_wait_for_outstanding_fusion()
4117 dev_warn(&instance->pdev->dev, "SR-IOV:" in megasas_wait_for_outstanding_fusion()
4122 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4130 megasas_complete_cmd_dpc_fusion((unsigned long)instance); in megasas_wait_for_outstanding_fusion()
4131 outstanding = atomic_read(&instance->fw_outstanding); in megasas_wait_for_outstanding_fusion()
4136 dev_notice(&instance->pdev->dev, "[%2d]waiting for %d " in megasas_wait_for_outstanding_fusion()
4138 outstanding, instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4143 if (instance->snapdump_wait_time) { in megasas_wait_for_outstanding_fusion()
4144 megasas_trigger_snap_dump(instance); in megasas_wait_for_outstanding_fusion()
4149 if (atomic_read(&instance->fw_outstanding)) { in megasas_wait_for_outstanding_fusion()
4150 dev_err(&instance->pdev->dev, "pending commands remain after waiting, " in megasas_wait_for_outstanding_fusion()
4152 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4161 void megasas_reset_reply_desc(struct megasas_instance *instance) in megasas_reset_reply_desc() argument
4167 fusion = instance->ctrl_context; in megasas_reset_reply_desc()
4168 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_reset_reply_desc()
4179 * @instance: Controller's soft instance
4181 static void megasas_refire_mgmt_cmd(struct megasas_instance *instance, in megasas_refire_mgmt_cmd() argument
4195 fusion = instance->ctrl_context; in megasas_refire_mgmt_cmd()
4200 for (j = instance->max_scsi_cmds ; j < instance->max_fw_cmds; j++) { in megasas_refire_mgmt_cmd()
4202 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in megasas_refire_mgmt_cmd()
4209 req_desc = megasas_get_request_descriptor(instance, smid - 1); in megasas_refire_mgmt_cmd()
4230 if (!instance->support_nvme_passthru) { in megasas_refire_mgmt_cmd()
4237 if (!instance->support_pci_lane_margining) { in megasas_refire_mgmt_cmd()
4249 dev_err(&instance->pdev->dev, in megasas_refire_mgmt_cmd()
4264 megasas_fire_cmd_fusion(instance, req_desc); in megasas_refire_mgmt_cmd()
4267 megasas_return_cmd(instance, cmd_mfi); in megasas_refire_mgmt_cmd()
4270 megasas_complete_cmd(instance, cmd_mfi, DID_OK); in megasas_refire_mgmt_cmd()
4279 * @instance: Controller's soft instance
4282 megasas_return_polled_cmds(struct megasas_instance *instance) in megasas_return_polled_cmds() argument
4289 fusion = instance->ctrl_context; in megasas_return_polled_cmds()
4291 for (i = instance->max_scsi_cmds; i < instance->max_fw_cmds; i++) { in megasas_return_polled_cmds()
4293 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in megasas_return_polled_cmds()
4297 dev_info(&instance->pdev->dev, in megasas_return_polled_cmds()
4302 megasas_return_cmd(instance, cmd_mfi); in megasas_return_polled_cmds()
4309 * @instance: per adapter struct
4316 static int megasas_track_scsiio(struct megasas_instance *instance, in megasas_track_scsiio() argument
4322 fusion = instance->ctrl_context; in megasas_track_scsiio()
4324 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_track_scsiio()
4329 dev_info(&instance->pdev->dev, in megasas_track_scsiio()
4344 * @instance: Controller's soft instance
4350 megasas_tm_response_code(struct megasas_instance *instance, in megasas_tm_response_code() argument
4384 dev_dbg(&instance->pdev->dev, "response_code(%01x): %s\n", in megasas_tm_response_code()
4386 dev_dbg(&instance->pdev->dev, in megasas_tm_response_code()
4396 * @instance: per adapter struct
4411 megasas_issue_tm(struct megasas_instance *instance, u16 device_handle, in megasas_issue_tm() argument
4427 fusion = instance->ctrl_context; in megasas_issue_tm()
4429 cmd_mfi = megasas_get_cmd(instance); in megasas_issue_tm()
4432 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_issue_tm()
4437 cmd_fusion = megasas_get_cmd_fusion(instance, in megasas_issue_tm()
4438 instance->max_scsi_cmds + cmd_mfi->index); in megasas_issue_tm()
4443 req_desc = megasas_get_request_descriptor(instance, in megasas_issue_tm()
4474 megasas_fire_cmd_fusion(instance, req_desc); in megasas_issue_tm()
4488 dev_err(&instance->pdev->dev, in megasas_issue_tm()
4490 mutex_unlock(&instance->reset_mutex); in megasas_issue_tm()
4491 rc = megasas_reset_fusion(instance->host, MFI_IO_TIMEOUT_OCR); in megasas_issue_tm()
4492 mutex_lock(&instance->reset_mutex); in megasas_issue_tm()
4497 megasas_tm_response_code(instance, mpi_reply); in megasas_issue_tm()
4499 megasas_return_cmd(instance, cmd_mfi); in megasas_issue_tm()
4508 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4509 megasas_sync_irqs((unsigned long)instance); in megasas_issue_tm()
4510 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4511 megasas_enable_irq_poll(instance); in megasas_issue_tm()
4521 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4522 megasas_sync_irqs((unsigned long)instance); in megasas_issue_tm()
4523 rc = megasas_track_scsiio(instance, id, channel); in megasas_issue_tm()
4524 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4525 megasas_enable_irq_poll(instance); in megasas_issue_tm()
4542 * @instance: per adapter struct
4549 struct megasas_instance *instance; in megasas_fusion_smid_lookup() local
4553 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_fusion_smid_lookup()
4555 fusion = instance->ctrl_context; in megasas_fusion_smid_lookup()
4557 for (i = 0; i < instance->max_scsi_cmds; i++) { in megasas_fusion_smid_lookup()
4580 struct megasas_instance *instance; in megasas_get_tm_devhandle() local
4585 instance = (struct megasas_instance *)sdev->host->hostdata; in megasas_get_tm_devhandle()
4586 fusion = instance->ctrl_context; in megasas_get_tm_devhandle()
4589 if (instance->use_seqnum_jbod_fp) { in megasas_get_tm_devhandle()
4593 [(instance->pd_seq_map_id - 1) & 1]; in megasas_get_tm_devhandle()
4616 struct megasas_instance *instance; in megasas_task_abort_fusion() local
4622 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_task_abort_fusion()
4624 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_task_abort_fusion()
4625 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_task_abort_fusion()
4626 "SCSI host:%d\n", instance->host->host_no); in megasas_task_abort_fusion()
4644 mutex_lock(&instance->reset_mutex); in megasas_task_abort_fusion()
4652 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4662 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4670 ret = megasas_issue_tm(instance, devhandle, in megasas_task_abort_fusion()
4676 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4697 struct megasas_instance *instance; in megasas_reset_target_fusion() local
4703 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_reset_target_fusion()
4705 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_reset_target_fusion()
4706 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_reset_target_fusion()
4707 "SCSI host:%d\n", instance->host->host_no); in megasas_reset_target_fusion()
4725 mutex_lock(&instance->reset_mutex); in megasas_reset_target_fusion()
4732 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4740 ret = megasas_issue_tm(instance, devhandle, in megasas_reset_target_fusion()
4745 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4753 /*SRIOV get other instance in cluster if any*/
4755 megasas_instance *megasas_get_peer_instance(struct megasas_instance *instance) in megasas_get_peer_instance() argument
4760 if (megasas_mgmt_info.instance[i] && in megasas_get_peer_instance()
4761 (megasas_mgmt_info.instance[i] != instance) && in megasas_get_peer_instance()
4762 megasas_mgmt_info.instance[i]->requestorId && in megasas_get_peer_instance()
4763 megasas_mgmt_info.instance[i]->peerIsPresent && in megasas_get_peer_instance()
4764 (memcmp((megasas_mgmt_info.instance[i]->clusterId), in megasas_get_peer_instance()
4765 instance->clusterId, MEGASAS_CLUSTER_ID_SIZE) == 0)) in megasas_get_peer_instance()
4766 return megasas_mgmt_info.instance[i]; in megasas_get_peer_instance()
4772 int megasas_check_mpio_paths(struct megasas_instance *instance, in megasas_check_mpio_paths() argument
4778 if (instance->peerIsPresent) { in megasas_check_mpio_paths()
4779 peer_instance = megasas_get_peer_instance(instance); in megasas_check_mpio_paths()
4792 struct megasas_instance *instance; in megasas_reset_fusion() local
4804 instance = (struct megasas_instance *)shost->hostdata; in megasas_reset_fusion()
4805 fusion = instance->ctrl_context; in megasas_reset_fusion()
4807 mutex_lock(&instance->reset_mutex); in megasas_reset_fusion()
4809 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { in megasas_reset_fusion()
4810 dev_warn(&instance->pdev->dev, "Hardware critical error, " in megasas_reset_fusion()
4812 instance->host->host_no); in megasas_reset_fusion()
4813 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4816 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4820 if (abs_state != MFI_STATE_FAULT && instance->crash_dump_buf && in megasas_reset_fusion()
4821 instance->crash_dump_app_support && reason) { in megasas_reset_fusion()
4822 dev_info(&instance->pdev->dev, "IO/DCMD timeout is detected, " in megasas_reset_fusion()
4824 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4825 status_reg = megasas_readl(instance, &instance->reg_set->doorbell); in megasas_reset_fusion()
4827 &instance->reg_set->doorbell); in megasas_reset_fusion()
4828 readl(&instance->reg_set->doorbell); in megasas_reset_fusion()
4829 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4833 dev_dbg(&instance->pdev->dev, "waiting for [%d] " in megasas_reset_fusion()
4836 } while ((atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) && in megasas_reset_fusion()
4839 if (atomic_read(&instance->adprecovery) == MEGASAS_HBA_OPERATIONAL) { in megasas_reset_fusion()
4840 dev_info(&instance->pdev->dev, "OCR done for IO " in megasas_reset_fusion()
4844 dev_info(&instance->pdev->dev, "Controller is not " in megasas_reset_fusion()
4853 if (instance->requestorId && !instance->skip_heartbeat_timer_del) in megasas_reset_fusion()
4854 del_timer_sync(&instance->sriov_heartbeat_timer); in megasas_reset_fusion()
4855 set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
4856 set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); in megasas_reset_fusion()
4857 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); in megasas_reset_fusion()
4858 instance->instancet->disable_intr(instance); in megasas_reset_fusion()
4859 megasas_sync_irqs((unsigned long)instance); in megasas_reset_fusion()
4862 if (megasas_wait_for_outstanding_fusion(instance, reason, in megasas_reset_fusion()
4864 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4865 dev_warn(&instance->pdev->dev, "resetting fusion " in megasas_reset_fusion()
4866 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4871 dev_info(&instance->pdev->dev, "\nPending SCSI commands:\n"); in megasas_reset_fusion()
4874 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_reset_fusion()
4877 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4878 r1_cmd = fusion->cmd_list[i + instance->max_fw_cmds]; in megasas_reset_fusion()
4879 megasas_return_cmd_fusion(instance, r1_cmd); in megasas_reset_fusion()
4895 megasas_check_mpio_paths(instance, in megasas_reset_fusion()
4897 if (instance->ldio_threshold && in megasas_reset_fusion()
4899 atomic_dec(&instance->ldio_outstanding); in megasas_reset_fusion()
4900 megasas_return_cmd_fusion(instance, cmd_fusion); in megasas_reset_fusion()
4906 dev_info(&instance->pdev->dev, "Outstanding fastpath IOs: %d\n", in megasas_reset_fusion()
4909 atomic_set(&instance->fw_outstanding, 0); in megasas_reset_fusion()
4911 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4914 if (instance->disableOnlineCtrlReset || in megasas_reset_fusion()
4917 dev_warn(&instance->pdev->dev, "Reset not supported" in megasas_reset_fusion()
4919 instance->host->host_no); in megasas_reset_fusion()
4924 if (instance->requestorId && !reason) { in megasas_reset_fusion()
4936 if (megasas_adp_reset_wait_for_ready(instance, in megasas_reset_fusion()
4941 if (megasas_transition_to_ready(instance, 1)) { in megasas_reset_fusion()
4942 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
4944 "scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4947 megasas_reset_reply_desc(instance); in megasas_reset_fusion()
4948 megasas_fusion_update_can_queue(instance, OCR_CONTEXT); in megasas_reset_fusion()
4950 if (megasas_ioc_init_fusion(instance)) { in megasas_reset_fusion()
4954 if (megasas_get_ctrl_info(instance)) { in megasas_reset_fusion()
4955 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
4961 megasas_refire_mgmt_cmd(instance, in megasas_reset_fusion()
4971 if (!megasas_get_map_info(instance)) { in megasas_reset_fusion()
4972 megasas_sync_map_info(instance); in megasas_reset_fusion()
4978 megasas_return_polled_cmds(instance); in megasas_reset_fusion()
4982 megasas_setup_jbod_map(instance); in megasas_reset_fusion()
4985 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4995 &instance->reset_flags); in megasas_reset_fusion()
4996 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
4997 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
4999 if ((instance->tgt_prop) && in megasas_reset_fusion()
5000 (instance->nvme_page_size)) in megasas_reset_fusion()
5001 ret_target_prop = megasas_get_target_prop(instance, sdev); in megasas_reset_fusion()
5007 status_reg = instance->instancet->read_fw_status_reg in megasas_reset_fusion()
5008 (instance); in megasas_reset_fusion()
5011 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5013 abs_state, instance->host->host_no); in megasas_reset_fusion()
5016 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
5018 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5020 instance->host->host_no); in megasas_reset_fusion()
5023 if (instance->requestorId) { in megasas_reset_fusion()
5024 if (!megasas_sriov_start_heartbeat(instance, 0)) in megasas_reset_fusion()
5025 megasas_start_timer(instance); in megasas_reset_fusion()
5027 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5030 if (instance->crash_dump_drv_support && in megasas_reset_fusion()
5031 instance->crash_dump_app_support) in megasas_reset_fusion()
5032 megasas_set_crash_dump_params(instance, in megasas_reset_fusion()
5035 megasas_set_crash_dump_params(instance, in megasas_reset_fusion()
5038 if (instance->snapdump_wait_time) { in megasas_reset_fusion()
5039 megasas_get_snapdump_properties(instance); in megasas_reset_fusion()
5040 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5042 instance->snapdump_wait_time); in megasas_reset_fusion()
5048 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
5050 instance->host->host_no); in megasas_reset_fusion()
5055 dev_warn(&instance->pdev->dev, "Reset failed, killing " in megasas_reset_fusion()
5056 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
5060 if (instance->requestorId) { in megasas_reset_fusion()
5061 megasas_start_timer(instance); in megasas_reset_fusion()
5063 clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
5064 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
5065 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
5066 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
5070 megaraid_sas_kill_hba(instance); in megasas_reset_fusion()
5071 megasas_enable_irq_poll(instance); in megasas_reset_fusion()
5072 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5075 clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); in megasas_reset_fusion()
5076 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
5081 static void megasas_fusion_crash_dump(struct megasas_instance *instance) in megasas_fusion_crash_dump() argument
5088 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5094 if (instance->drv_buf_index == 0) { in megasas_fusion_crash_dump()
5098 if (instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5099 dev_info(&instance->pdev->dev, "earlier crash dump is " in megasas_fusion_crash_dump()
5104 &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5105 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5108 megasas_alloc_host_crash_buffer(instance); in megasas_fusion_crash_dump()
5109 dev_info(&instance->pdev->dev, "Number of host crash buffers " in megasas_fusion_crash_dump()
5110 "allocated: %d\n", instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5123 status_reg = instance->instancet->read_fw_status_reg( in megasas_fusion_crash_dump()
5124 instance); in megasas_fusion_crash_dump()
5129 if (instance->drv_buf_index >= instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5130 dev_info(&instance->pdev->dev, in megasas_fusion_crash_dump()
5132 instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5137 memcpy(instance->crash_buf[instance->drv_buf_index], in megasas_fusion_crash_dump()
5138 instance->crash_dump_buf, CRASH_DMA_BUF_SIZE); in megasas_fusion_crash_dump()
5139 instance->drv_buf_index++; in megasas_fusion_crash_dump()
5143 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5144 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5147 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5151 dev_info(&instance->pdev->dev, "Crash Dump is available,number " in megasas_fusion_crash_dump()
5152 "of copied buffers: %d\n", instance->drv_buf_index); in megasas_fusion_crash_dump()
5153 instance->fw_crash_buffer_size = instance->drv_buf_index; in megasas_fusion_crash_dump()
5154 instance->fw_crash_state = AVAILABLE; in megasas_fusion_crash_dump()
5155 instance->drv_buf_index = 0; in megasas_fusion_crash_dump()
5156 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5157 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5159 megasas_reset_fusion(instance->host, 0); in megasas_fusion_crash_dump()
5167 struct megasas_instance *instance = in megasas_fusion_ocr_wq() local
5170 megasas_reset_fusion(instance->host, 0); in megasas_fusion_ocr_wq()
5175 megasas_alloc_fusion_context(struct megasas_instance *instance) in megasas_alloc_fusion_context() argument
5179 instance->ctrl_context = kzalloc(sizeof(struct fusion_context), in megasas_alloc_fusion_context()
5181 if (!instance->ctrl_context) { in megasas_alloc_fusion_context()
5182 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5187 fusion = instance->ctrl_context; in megasas_alloc_fusion_context()
5199 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5215 dev_err(&instance->pdev->dev, "Failed to allocate load_balance_info, " in megasas_alloc_fusion_context()
5223 megasas_free_fusion_context(struct megasas_instance *instance) in megasas_free_fusion_context() argument
5225 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_fusion_context()