Lines Matching +full:os +full:- +full:initiated
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2009-2013 LSI Corporation
6 * Copyright (c) 2013-2016 Avago Technologies
7 * Copyright (c) 2016-2018 Broadcom Inc.
76 * megasas_adp_reset_wait_for_ready - initiate chip reset and wait for
96 * when diag reset is initiated from driver in megasas_adp_reset_wait_for_ready()
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()
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()
132 * megasas_check_same_4gb_region - check if allocation
150 dev_err(&instance->pdev->dev, in megasas_check_same_4gb_region()
161 * megasas_enable_intr_fusion - Enables interrupts
168 regs = instance->reg_set; in megasas_enable_intr_fusion()
170 instance->mask_interrupts = 0; in megasas_enable_intr_fusion()
172 writel(~0, ®s->outbound_intr_status); in megasas_enable_intr_fusion()
173 readl(®s->outbound_intr_status); in megasas_enable_intr_fusion()
175 writel(~MFI_FUSION_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask); 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()
179 __func__, readl(®s->outbound_intr_mask)); in megasas_enable_intr_fusion()
183 * megasas_disable_intr_fusion - Disables interrupt
191 regs = instance->reg_set; in megasas_disable_intr_fusion()
192 instance->mask_interrupts = 1; in megasas_disable_intr_fusion()
194 writel(mask, ®s->outbound_intr_mask); 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()
197 __func__, readl(®s->outbound_intr_mask)); in megasas_disable_intr_fusion()
205 regs = instance->reg_set; in megasas_clear_intr_fusion()
210 ®s->outbound_intr_status); in megasas_clear_intr_fusion()
213 writel(status, ®s->outbound_intr_status); in megasas_clear_intr_fusion()
214 readl(®s->outbound_intr_status); in megasas_clear_intr_fusion()
224 * megasas_get_cmd_fusion - Get a command from the free pool
235 fusion = instance->ctrl_context; in megasas_get_cmd_fusion()
236 return fusion->cmd_list[blk_tag]; in megasas_get_cmd_fusion()
240 * megasas_return_cmd_fusion - Return a cmd to free command pool
247 cmd->scmd = NULL; in megasas_return_cmd_fusion()
248 memset(cmd->io_request, 0, MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE); in megasas_return_cmd_fusion()
249 cmd->r1_alt_dev_handle = MR_DEVHANDLE_INVALID; in megasas_return_cmd_fusion()
250 cmd->cmd_completed = false; in megasas_return_cmd_fusion()
254 * megasas_write_64bit_req_desc - PCI writes 64bit request descriptor
263 u64 req_data = (((u64)le32_to_cpu(req_desc->u.high) << 32) | in megasas_write_64bit_req_desc()
264 le32_to_cpu(req_desc->u.low)); in megasas_write_64bit_req_desc()
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()
269 writel(le32_to_cpu(req_desc->u.low), in megasas_write_64bit_req_desc()
270 &instance->reg_set->inbound_low_queue_port); in megasas_write_64bit_req_desc()
271 writel(le32_to_cpu(req_desc->u.high), 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()
278 * megasas_fire_cmd_fusion - Sends command to the FW
289 if (instance->atomic_desc_support) in megasas_fire_cmd_fusion()
290 writel(le32_to_cpu(req_desc->u.low), in megasas_fire_cmd_fusion()
291 &instance->reg_set->inbound_single_queue_port); in megasas_fire_cmd_fusion()
297 * megasas_fusion_update_can_queue - Do all Adapter Queue depth related calculations here
304 * more resource than exposed to the OS.
314 if (instance->adapter_type < VENTURA_SERIES) 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()
330 cur_max_fw_cmds = cur_max_fw_cmds - 1; 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()
333 cur_max_fw_cmds - (MEGASAS_FUSION_INTERNAL_CMDS + 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()
364 scmd->device->request_queue->queue_hw_ctx[0]; in megasas_get_msix_index()
366 sdev_busy = atomic_read(&hctx->nr_active); in megasas_get_msix_index()
368 if (instance->perf_mode == MR_BALANCED_PERF_MODE && in megasas_get_msix_index()
370 cmd->request_desc->SCSIIO.MSIxIndex = 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()
374 cmd->request_desc->SCSIIO.MSIxIndex = 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()
378 cmd->request_desc->SCSIIO.MSIxIndex = in megasas_get_msix_index()
379 instance->reply_map[raw_smp_processor_id()]; in megasas_get_msix_index()
383 * megasas_free_cmds_fusion - Free all the cmds in the free cmd pool
390 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_cmds_fusion()
393 if (fusion->sense) in megasas_free_cmds_fusion()
394 dma_pool_free(fusion->sense_dma_pool, fusion->sense, in megasas_free_cmds_fusion()
395 fusion->sense_phys_addr); in megasas_free_cmds_fusion()
398 if (fusion->cmd_list) { in megasas_free_cmds_fusion()
399 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_free_cmds_fusion()
400 cmd = fusion->cmd_list[i]; in megasas_free_cmds_fusion()
402 if (cmd->sg_frame) in megasas_free_cmds_fusion()
403 dma_pool_free(fusion->sg_dma_pool, in megasas_free_cmds_fusion()
404 cmd->sg_frame, in megasas_free_cmds_fusion()
405 cmd->sg_frame_phys_addr); in megasas_free_cmds_fusion()
409 kfree(fusion->cmd_list); in megasas_free_cmds_fusion()
412 if (fusion->sg_dma_pool) { in megasas_free_cmds_fusion()
413 dma_pool_destroy(fusion->sg_dma_pool); in megasas_free_cmds_fusion()
414 fusion->sg_dma_pool = NULL; in megasas_free_cmds_fusion()
416 if (fusion->sense_dma_pool) { in megasas_free_cmds_fusion()
417 dma_pool_destroy(fusion->sense_dma_pool); in megasas_free_cmds_fusion()
418 fusion->sense_dma_pool = NULL; in megasas_free_cmds_fusion()
423 if (instance->is_rdpq) in megasas_free_cmds_fusion()
429 if (fusion->req_frames_desc) in megasas_free_cmds_fusion()
430 dma_free_coherent(&instance->pdev->dev, in megasas_free_cmds_fusion()
431 fusion->request_alloc_sz, fusion->req_frames_desc, in megasas_free_cmds_fusion()
432 fusion->req_frames_desc_phys); in megasas_free_cmds_fusion()
433 if (fusion->io_request_frames) in megasas_free_cmds_fusion()
434 dma_pool_free(fusion->io_request_frames_pool, in megasas_free_cmds_fusion()
435 fusion->io_request_frames, in megasas_free_cmds_fusion()
436 fusion->io_request_frames_phys); in megasas_free_cmds_fusion()
437 if (fusion->io_request_frames_pool) { in megasas_free_cmds_fusion()
438 dma_pool_destroy(fusion->io_request_frames_pool); in megasas_free_cmds_fusion()
439 fusion->io_request_frames_pool = NULL; in megasas_free_cmds_fusion()
444 * megasas_create_sg_sense_fusion - Creates DMA pool for cmd frames
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()
461 fusion->sg_dma_pool = 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()
466 fusion->sense_dma_pool = in megasas_create_sg_sense_fusion()
467 dma_pool_create("mr_sense", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
470 if (!fusion->sense_dma_pool || !fusion->sg_dma_pool) { in megasas_create_sg_sense_fusion()
471 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
473 return -ENOMEM; in megasas_create_sg_sense_fusion()
476 fusion->sense = dma_pool_alloc(fusion->sense_dma_pool, in megasas_create_sg_sense_fusion()
477 GFP_KERNEL, &fusion->sense_phys_addr); in megasas_create_sg_sense_fusion()
478 if (!fusion->sense) { in megasas_create_sg_sense_fusion()
479 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
481 return -ENOMEM; in megasas_create_sg_sense_fusion()
495 if (!megasas_check_same_4gb_region(instance, fusion->sense_phys_addr, in megasas_create_sg_sense_fusion()
497 dma_pool_free(fusion->sense_dma_pool, fusion->sense, in megasas_create_sg_sense_fusion()
498 fusion->sense_phys_addr); in megasas_create_sg_sense_fusion()
499 fusion->sense = NULL; in megasas_create_sg_sense_fusion()
500 dma_pool_destroy(fusion->sense_dma_pool); in megasas_create_sg_sense_fusion()
502 fusion->sense_dma_pool = in megasas_create_sg_sense_fusion()
503 dma_pool_create("mr_sense_align", &instance->pdev->dev, in megasas_create_sg_sense_fusion()
506 if (!fusion->sense_dma_pool) { in megasas_create_sg_sense_fusion()
507 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
509 return -ENOMEM; in megasas_create_sg_sense_fusion()
511 fusion->sense = dma_pool_alloc(fusion->sense_dma_pool, in megasas_create_sg_sense_fusion()
513 &fusion->sense_phys_addr); in megasas_create_sg_sense_fusion()
514 if (!fusion->sense) { in megasas_create_sg_sense_fusion()
515 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
517 return -ENOMEM; in megasas_create_sg_sense_fusion()
525 cmd = fusion->cmd_list[i]; in megasas_create_sg_sense_fusion()
526 cmd->sg_frame = dma_pool_alloc(fusion->sg_dma_pool, in megasas_create_sg_sense_fusion()
527 GFP_KERNEL, &cmd->sg_frame_phys_addr); in megasas_create_sg_sense_fusion()
530 cmd->sense = (u8 *)fusion->sense + offset; in megasas_create_sg_sense_fusion()
531 cmd->sense_phys_addr = fusion->sense_phys_addr + offset; in megasas_create_sg_sense_fusion()
533 if (!cmd->sg_frame) { in megasas_create_sg_sense_fusion()
534 dev_err(&instance->pdev->dev, in megasas_create_sg_sense_fusion()
536 return -ENOMEM; in megasas_create_sg_sense_fusion()
541 for (i = max_cmd; i < instance->max_mpt_cmds; i++) { in megasas_create_sg_sense_fusion()
542 cmd = fusion->cmd_list[i]; in megasas_create_sg_sense_fusion()
544 cmd->sense = (u8 *)fusion->sense + offset; in megasas_create_sg_sense_fusion()
545 cmd->sense_phys_addr = fusion->sense_phys_addr + offset; in megasas_create_sg_sense_fusion()
558 fusion = instance->ctrl_context; in megasas_alloc_cmdlist_fusion()
560 max_mpt_cmd = instance->max_mpt_cmds; in megasas_alloc_cmdlist_fusion()
563 * fusion->cmd_list is an array of struct megasas_cmd_fusion pointers. in megasas_alloc_cmdlist_fusion()
567 fusion->cmd_list = in megasas_alloc_cmdlist_fusion()
570 if (!fusion->cmd_list) { in megasas_alloc_cmdlist_fusion()
571 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
573 return -ENOMEM; in megasas_alloc_cmdlist_fusion()
577 fusion->cmd_list[i] = kzalloc(sizeof(struct megasas_cmd_fusion), in megasas_alloc_cmdlist_fusion()
579 if (!fusion->cmd_list[i]) { in megasas_alloc_cmdlist_fusion()
581 kfree(fusion->cmd_list[j]); in megasas_alloc_cmdlist_fusion()
582 kfree(fusion->cmd_list); in megasas_alloc_cmdlist_fusion()
583 dev_err(&instance->pdev->dev, in megasas_alloc_cmdlist_fusion()
585 return -ENOMEM; in megasas_alloc_cmdlist_fusion()
597 fusion = instance->ctrl_context; in megasas_alloc_request_fusion()
600 fusion->io_request_frames_pool = in megasas_alloc_request_fusion()
601 dma_pool_create("mr_ioreq", &instance->pdev->dev, in megasas_alloc_request_fusion()
602 fusion->io_frames_alloc_sz, 16, 0); in megasas_alloc_request_fusion()
604 if (!fusion->io_request_frames_pool) { in megasas_alloc_request_fusion()
605 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
607 return -ENOMEM; in megasas_alloc_request_fusion()
610 fusion->io_request_frames = in megasas_alloc_request_fusion()
611 dma_pool_alloc(fusion->io_request_frames_pool, in megasas_alloc_request_fusion()
613 &fusion->io_request_frames_phys); in megasas_alloc_request_fusion()
614 if (!fusion->io_request_frames) { 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()
617 dma_pool_destroy(fusion->io_request_frames_pool); in megasas_alloc_request_fusion()
621 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
623 return -ENOMEM; in megasas_alloc_request_fusion()
628 fusion->io_request_frames_phys, in megasas_alloc_request_fusion()
629 fusion->io_frames_alloc_sz)) { in megasas_alloc_request_fusion()
630 dma_pool_free(fusion->io_request_frames_pool, in megasas_alloc_request_fusion()
631 fusion->io_request_frames, in megasas_alloc_request_fusion()
632 fusion->io_request_frames_phys); in megasas_alloc_request_fusion()
633 fusion->io_request_frames = NULL; in megasas_alloc_request_fusion()
634 dma_pool_destroy(fusion->io_request_frames_pool); in megasas_alloc_request_fusion()
636 fusion->io_request_frames_pool = in megasas_alloc_request_fusion()
638 &instance->pdev->dev, in megasas_alloc_request_fusion()
639 fusion->io_frames_alloc_sz, in megasas_alloc_request_fusion()
640 roundup_pow_of_two(fusion->io_frames_alloc_sz), in megasas_alloc_request_fusion()
643 if (!fusion->io_request_frames_pool) { in megasas_alloc_request_fusion()
644 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
646 return -ENOMEM; in megasas_alloc_request_fusion()
649 fusion->io_request_frames = in megasas_alloc_request_fusion()
650 dma_pool_alloc(fusion->io_request_frames_pool, in megasas_alloc_request_fusion()
652 &fusion->io_request_frames_phys); in megasas_alloc_request_fusion()
654 if (!fusion->io_request_frames) { in megasas_alloc_request_fusion()
655 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
657 return -ENOMEM; in megasas_alloc_request_fusion()
661 fusion->req_frames_desc = in megasas_alloc_request_fusion()
662 dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_request_fusion()
663 fusion->request_alloc_sz, in megasas_alloc_request_fusion()
664 &fusion->req_frames_desc_phys, GFP_KERNEL); in megasas_alloc_request_fusion()
665 if (!fusion->req_frames_desc) { in megasas_alloc_request_fusion()
666 dev_err(&instance->pdev->dev, in megasas_alloc_request_fusion()
668 return -ENOMEM; in megasas_alloc_request_fusion()
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()
683 fusion->reply_frames_desc_pool = in megasas_alloc_reply_fusion()
684 dma_pool_create("mr_reply", &instance->pdev->dev, in megasas_alloc_reply_fusion()
685 fusion->reply_alloc_sz * count, 16, 0); in megasas_alloc_reply_fusion()
687 if (!fusion->reply_frames_desc_pool) { in megasas_alloc_reply_fusion()
688 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
690 return -ENOMEM; in megasas_alloc_reply_fusion()
693 fusion->reply_frames_desc[0] = in megasas_alloc_reply_fusion()
694 dma_pool_alloc(fusion->reply_frames_desc_pool, in megasas_alloc_reply_fusion()
695 GFP_KERNEL, &fusion->reply_frames_desc_phys[0]); in megasas_alloc_reply_fusion()
696 if (!fusion->reply_frames_desc[0]) { in megasas_alloc_reply_fusion()
697 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
699 return -ENOMEM; in megasas_alloc_reply_fusion()
703 fusion->reply_frames_desc_phys[0], in megasas_alloc_reply_fusion()
704 (fusion->reply_alloc_sz * count))) { in megasas_alloc_reply_fusion()
705 dma_pool_free(fusion->reply_frames_desc_pool, in megasas_alloc_reply_fusion()
706 fusion->reply_frames_desc[0], in megasas_alloc_reply_fusion()
707 fusion->reply_frames_desc_phys[0]); in megasas_alloc_reply_fusion()
708 fusion->reply_frames_desc[0] = NULL; in megasas_alloc_reply_fusion()
709 dma_pool_destroy(fusion->reply_frames_desc_pool); in megasas_alloc_reply_fusion()
711 fusion->reply_frames_desc_pool = in megasas_alloc_reply_fusion()
713 &instance->pdev->dev, in megasas_alloc_reply_fusion()
714 fusion->reply_alloc_sz * count, in megasas_alloc_reply_fusion()
715 roundup_pow_of_two(fusion->reply_alloc_sz * count), in megasas_alloc_reply_fusion()
718 if (!fusion->reply_frames_desc_pool) { in megasas_alloc_reply_fusion()
719 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
721 return -ENOMEM; in megasas_alloc_reply_fusion()
724 fusion->reply_frames_desc[0] = in megasas_alloc_reply_fusion()
725 dma_pool_alloc(fusion->reply_frames_desc_pool, in megasas_alloc_reply_fusion()
727 &fusion->reply_frames_desc_phys[0]); in megasas_alloc_reply_fusion()
729 if (!fusion->reply_frames_desc[0]) { in megasas_alloc_reply_fusion()
730 dev_err(&instance->pdev->dev, in megasas_alloc_reply_fusion()
732 return -ENOMEM; in megasas_alloc_reply_fusion()
736 reply_desc = fusion->reply_frames_desc[0]; in megasas_alloc_reply_fusion()
737 for (i = 0; i < fusion->reply_q_depth * count; i++, reply_desc++) in megasas_alloc_reply_fusion()
738 reply_desc->Words = cpu_to_le64(ULLONG_MAX); in megasas_alloc_reply_fusion()
743 for (i = 0; i < (count - 1); i++) in megasas_alloc_reply_fusion()
744 fusion->reply_frames_desc[i + 1] = in megasas_alloc_reply_fusion()
745 fusion->reply_frames_desc[i] + in megasas_alloc_reply_fusion()
746 (fusion->reply_alloc_sz)/sizeof(union MPI2_REPLY_DESCRIPTORS_UNION); in megasas_alloc_reply_fusion()
762 fusion = instance->ctrl_context; in megasas_alloc_rdpq_fusion()
763 chunk_size = fusion->reply_alloc_sz * RDPQ_MAX_INDEX_IN_ONE_CHUNK; in megasas_alloc_rdpq_fusion()
767 fusion->rdpq_virt = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
768 array_size, &fusion->rdpq_phys, in megasas_alloc_rdpq_fusion()
770 if (!fusion->rdpq_virt) { in megasas_alloc_rdpq_fusion()
771 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
773 return -ENOMEM; in megasas_alloc_rdpq_fusion()
776 msix_count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_alloc_rdpq_fusion()
778 fusion->reply_frames_desc_pool = dma_pool_create("mr_rdpq", in megasas_alloc_rdpq_fusion()
779 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
781 fusion->reply_frames_desc_pool_align = in megasas_alloc_rdpq_fusion()
783 &instance->pdev->dev, in megasas_alloc_rdpq_fusion()
788 if (!fusion->reply_frames_desc_pool || in megasas_alloc_rdpq_fusion()
789 !fusion->reply_frames_desc_pool_align) { in megasas_alloc_rdpq_fusion()
790 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
792 return -ENOMEM; in megasas_alloc_rdpq_fusion()
796 * For INVADER_SERIES each set of 8 reply queues(0-7, 8-15, ..) and in megasas_alloc_rdpq_fusion()
797 * VENTURA_SERIES each set of 16 reply queues(0-15, 16-31, ..) should be in megasas_alloc_rdpq_fusion()
799 * upper 32-bits in their memory address. so here driver is allocating the in megasas_alloc_rdpq_fusion()
807 dma_pool_alloc(fusion->reply_frames_desc_pool, in megasas_alloc_rdpq_fusion()
810 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
812 return -ENOMEM; in megasas_alloc_rdpq_fusion()
828 dma_pool_free(fusion->reply_frames_desc_pool, in megasas_alloc_rdpq_fusion()
833 dma_pool_alloc(fusion->reply_frames_desc_pool_align, in megasas_alloc_rdpq_fusion()
836 dev_err(&instance->pdev->dev, in megasas_alloc_rdpq_fusion()
839 return -ENOMEM; in megasas_alloc_rdpq_fusion()
841 fusion->rdpq_tracker[i].dma_pool_ptr = in megasas_alloc_rdpq_fusion()
842 fusion->reply_frames_desc_pool_align; in megasas_alloc_rdpq_fusion()
844 fusion->rdpq_tracker[i].dma_pool_ptr = in megasas_alloc_rdpq_fusion()
845 fusion->reply_frames_desc_pool; in megasas_alloc_rdpq_fusion()
848 fusion->rdpq_tracker[i].pool_entry_phys = rdpq_chunk_phys[i]; in megasas_alloc_rdpq_fusion()
849 fusion->rdpq_tracker[i].pool_entry_virt = rdpq_chunk_virt[i]; in megasas_alloc_rdpq_fusion()
858 offset = fusion->reply_alloc_sz * i; in megasas_alloc_rdpq_fusion()
859 fusion->rdpq_virt[abs_index].RDPQBaseAddress = in megasas_alloc_rdpq_fusion()
861 fusion->reply_frames_desc_phys[abs_index] = in megasas_alloc_rdpq_fusion()
863 fusion->reply_frames_desc[abs_index] = in megasas_alloc_rdpq_fusion()
866 reply_desc = fusion->reply_frames_desc[abs_index]; in megasas_alloc_rdpq_fusion()
867 for (j = 0; j < fusion->reply_q_depth; j++, reply_desc++) in megasas_alloc_rdpq_fusion()
868 reply_desc->Words = ULLONG_MAX; in megasas_alloc_rdpq_fusion()
881 fusion = instance->ctrl_context; in megasas_free_rdpq_fusion()
884 if (fusion->rdpq_tracker[i].pool_entry_virt) in megasas_free_rdpq_fusion()
885 dma_pool_free(fusion->rdpq_tracker[i].dma_pool_ptr, in megasas_free_rdpq_fusion()
886 fusion->rdpq_tracker[i].pool_entry_virt, in megasas_free_rdpq_fusion()
887 fusion->rdpq_tracker[i].pool_entry_phys); in megasas_free_rdpq_fusion()
891 dma_pool_destroy(fusion->reply_frames_desc_pool); in megasas_free_rdpq_fusion()
892 dma_pool_destroy(fusion->reply_frames_desc_pool_align); in megasas_free_rdpq_fusion()
894 if (fusion->rdpq_virt) in megasas_free_rdpq_fusion()
895 dma_free_coherent(&instance->pdev->dev, in megasas_free_rdpq_fusion()
897 fusion->rdpq_virt, fusion->rdpq_phys); in megasas_free_rdpq_fusion()
905 fusion = instance->ctrl_context; in megasas_free_reply_fusion()
907 if (fusion->reply_frames_desc[0]) in megasas_free_reply_fusion()
908 dma_pool_free(fusion->reply_frames_desc_pool, in megasas_free_reply_fusion()
909 fusion->reply_frames_desc[0], in megasas_free_reply_fusion()
910 fusion->reply_frames_desc_phys[0]); in megasas_free_reply_fusion()
912 dma_pool_destroy(fusion->reply_frames_desc_pool); in megasas_free_reply_fusion()
918 * megasas_alloc_cmds_fusion - Allocates the command packets
922 * Each frame has a 32-bit field called context. This context is used to get
944 fusion = instance->ctrl_context; in megasas_alloc_cmds_fusion()
949 if (instance->is_rdpq) { 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()
963 io_req_base = fusion->io_request_frames + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE; in megasas_alloc_cmds_fusion()
964 io_req_base_phys = fusion->io_request_frames_phys + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE; in megasas_alloc_cmds_fusion()
967 * Add all the commands to command pool (fusion->cmd_pool) in megasas_alloc_cmds_fusion()
971 for (i = 0; i < instance->max_mpt_cmds; i++) { in megasas_alloc_cmds_fusion()
972 cmd = fusion->cmd_list[i]; in megasas_alloc_cmds_fusion()
975 cmd->index = i + 1; in megasas_alloc_cmds_fusion()
976 cmd->scmd = NULL; in megasas_alloc_cmds_fusion()
977 cmd->sync_cmd_idx = 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()
982 cmd->io_request = in megasas_alloc_cmds_fusion()
985 memset(cmd->io_request, 0, in megasas_alloc_cmds_fusion()
987 cmd->io_request_phys_addr = io_req_base_phys + offset; in megasas_alloc_cmds_fusion()
988 cmd->r1_alt_dev_handle = MR_DEVHANDLE_INVALID; in megasas_alloc_cmds_fusion()
998 return -ENOMEM; in megasas_alloc_cmds_fusion()
1002 * wait_and_poll - Issues a polling command
1014 struct megasas_header *frame_hdr = &cmd->frame->hdr; in wait_and_poll()
1022 for (i = 0; (i < msecs) && (frame_hdr->cmd_status == 0xff); i += 20) { in wait_and_poll()
1026 status_reg = instance->instancet->read_fw_status_reg(instance) in wait_and_poll()
1033 if (frame_hdr->cmd_status == MFI_STAT_INVALID_STATUS) in wait_and_poll()
1035 else if (frame_hdr->cmd_status == MFI_STAT_OK) in wait_and_poll()
1042 * megasas_ioc_init_fusion - Initializes the FW
1066 fusion = instance->ctrl_context; in megasas_ioc_init_fusion()
1068 ioc_init_handle = fusion->ioc_init_request_phys; in megasas_ioc_init_fusion()
1069 IOCInitMessage = fusion->ioc_init_request; in megasas_ioc_init_fusion()
1071 cmd = fusion->ioc_init_cmd; 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()
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()
1115 IOCInitMessage->Function = MPI2_FUNCTION_IOC_INIT; in megasas_ioc_init_fusion()
1116 IOCInitMessage->WhoInit = MPI2_WHOINIT_HOST_DRIVER; in megasas_ioc_init_fusion()
1117 IOCInitMessage->MsgVersion = cpu_to_le16(MPI2_VERSION); in megasas_ioc_init_fusion()
1118 IOCInitMessage->HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION); in megasas_ioc_init_fusion()
1119 IOCInitMessage->SystemRequestFrameSize = cpu_to_le16(MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE / 4); in megasas_ioc_init_fusion()
1121 IOCInitMessage->ReplyDescriptorPostQueueDepth = cpu_to_le16(fusion->reply_q_depth); in megasas_ioc_init_fusion()
1122 IOCInitMessage->ReplyDescriptorPostQueueAddress = instance->is_rdpq ? in megasas_ioc_init_fusion()
1123 cpu_to_le64(fusion->rdpq_phys) : in megasas_ioc_init_fusion()
1124 cpu_to_le64(fusion->reply_frames_desc_phys[0]); in megasas_ioc_init_fusion()
1125 IOCInitMessage->MsgFlags = instance->is_rdpq ? in megasas_ioc_init_fusion()
1127 IOCInitMessage->SystemRequestFrameBaseAddress = cpu_to_le64(fusion->io_request_frames_phys); in megasas_ioc_init_fusion()
1128 IOCInitMessage->SenseBufferAddressHigh = cpu_to_le32(upper_32_bits(fusion->sense_phys_addr)); in megasas_ioc_init_fusion()
1129 IOCInitMessage->HostMSIxVectors = instance->msix_vectors; in megasas_ioc_init_fusion()
1130 IOCInitMessage->HostPageSize = MR_DEFAULT_NVME_PAGE_SHIFT; in megasas_ioc_init_fusion()
1134 IOCInitMessage->TimeStamp = cpu_to_le64(ktime_to_ms(time)); in megasas_ioc_init_fusion()
1136 init_frame = (struct megasas_init_frame *)cmd->frame; in megasas_ioc_init_fusion()
1139 frame_hdr = &cmd->frame->hdr; in megasas_ioc_init_fusion()
1140 frame_hdr->cmd_status = 0xFF; in megasas_ioc_init_fusion()
1141 frame_hdr->flags |= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE); in megasas_ioc_init_fusion()
1143 init_frame->cmd = MFI_CMD_INIT; in megasas_ioc_init_fusion()
1144 init_frame->cmd_status = 0xFF; in megasas_ioc_init_fusion()
1146 drv_ops = (MFI_CAPABILITIES *) &(init_frame->driver_operations); in megasas_ioc_init_fusion()
1149 if (instance->adapter_type >= INVADER_SERIES) in megasas_ioc_init_fusion()
1150 drv_ops->mfi_capabilities.support_additional_msix = 1; in megasas_ioc_init_fusion()
1152 drv_ops->mfi_capabilities.support_fp_remote_lun = 1; in megasas_ioc_init_fusion()
1154 drv_ops->mfi_capabilities.support_max_255lds = 1; in megasas_ioc_init_fusion()
1155 drv_ops->mfi_capabilities.support_ndrive_r1_lb = 1; in megasas_ioc_init_fusion()
1156 drv_ops->mfi_capabilities.security_protocol_cmds_fw = 1; in megasas_ioc_init_fusion()
1158 if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN) in megasas_ioc_init_fusion()
1159 drv_ops->mfi_capabilities.support_ext_io_size = 1; in megasas_ioc_init_fusion()
1161 drv_ops->mfi_capabilities.support_fp_rlbypass = 1; in megasas_ioc_init_fusion()
1163 drv_ops->mfi_capabilities.support_ext_queue_depth = 1; in megasas_ioc_init_fusion()
1165 drv_ops->mfi_capabilities.support_qd_throttling = 1; in megasas_ioc_init_fusion()
1166 drv_ops->mfi_capabilities.support_pd_map_target_id = 1; in megasas_ioc_init_fusion()
1167 drv_ops->mfi_capabilities.support_nvme_passthru = 1; in megasas_ioc_init_fusion()
1168 drv_ops->mfi_capabilities.support_fw_exposed_dev_list = 1; in megasas_ioc_init_fusion()
1170 if (instance->consistent_mask_64bit) in megasas_ioc_init_fusion()
1171 drv_ops->mfi_capabilities.support_64bit_mode = 1; in megasas_ioc_init_fusion()
1174 cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities); 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()
1186 init_frame->queue_info_new_phys_addr_hi = in megasas_ioc_init_fusion()
1188 init_frame->queue_info_new_phys_addr_lo = in megasas_ioc_init_fusion()
1190 init_frame->data_xfer_len = cpu_to_le32(sizeof(struct MPI2_IOC_INIT_REQUEST)); in megasas_ioc_init_fusion()
1193 * Each bit in replyqueue_mask represents one group of MSI-x vectors in megasas_ioc_init_fusion()
1196 switch (instance->perf_mode) { in megasas_ioc_init_fusion()
1198 init_frame->replyqueue_mask = in megasas_ioc_init_fusion()
1199 cpu_to_le16(~(~0 << instance->low_latency_index_start/8)); in megasas_ioc_init_fusion()
1202 init_frame->replyqueue_mask = in megasas_ioc_init_fusion()
1203 cpu_to_le16(~(~0 << instance->msix_vectors/8)); in megasas_ioc_init_fusion()
1208 req_desc.u.low = cpu_to_le32(lower_32_bits(cmd->frame_phys_addr)); in megasas_ioc_init_fusion()
1209 req_desc.u.high = cpu_to_le32(upper_32_bits(cmd->frame_phys_addr)); 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()
1231 frame_hdr = &cmd->frame->hdr; in megasas_ioc_init_fusion()
1232 if (frame_hdr->cmd_status != 0) { 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()
1259 * megasas_sync_pd_seq_num - JBOD SEQ MAP
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()
1279 pd_seq_map_sz = struct_size(pd_sync, seq, MAX_PHYSICAL_DEVICES - 1); in megasas_sync_pd_seq_num()
1283 dev_err(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1286 return -ENOMEM; in megasas_sync_pd_seq_num()
1289 dcmd = &cmd->frame->dcmd; in megasas_sync_pd_seq_num()
1292 memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE); in megasas_sync_pd_seq_num()
1295 dcmd->mbox.b[0] = MEGASAS_DCMD_MBOX_PEND_FLAG; in megasas_sync_pd_seq_num()
1296 dcmd->flags = MFI_FRAME_DIR_WRITE; in megasas_sync_pd_seq_num()
1297 instance->jbod_seq_cmd = cmd; in megasas_sync_pd_seq_num()
1299 dcmd->flags = MFI_FRAME_DIR_READ; in megasas_sync_pd_seq_num()
1302 dcmd->cmd = MFI_CMD_DCMD; in megasas_sync_pd_seq_num()
1303 dcmd->cmd_status = 0xFF; in megasas_sync_pd_seq_num()
1304 dcmd->sge_count = 1; in megasas_sync_pd_seq_num()
1305 dcmd->timeout = 0; in megasas_sync_pd_seq_num()
1306 dcmd->pad_0 = 0; in megasas_sync_pd_seq_num()
1307 dcmd->data_xfer_len = cpu_to_le32(pd_seq_map_sz); in megasas_sync_pd_seq_num()
1308 dcmd->opcode = cpu_to_le32(MR_DCMD_SYSTEM_PD_MAP_GET_INFO); 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()
1324 if (le32_to_cpu(pd_sync->count) > MAX_PHYSICAL_DEVICES) { in megasas_sync_pd_seq_num()
1325 dev_warn(&instance->pdev->dev, in megasas_sync_pd_seq_num()
1327 MAX_PHYSICAL_DEVICES, le32_to_cpu(pd_sync->count)); in megasas_sync_pd_seq_num()
1328 ret = -EINVAL; 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()
1344 * megasas_get_ld_map_info - Returns FW's ld_map structure
1351 * dcmd.mbox.b[0] - number of LDs being sync'd
1352 * dcmd.mbox.b[1] - 0 - complete command immediately.
1353 * - 1 - pend till config change
1354 * dcmd.mbox.b[2] - 0 - supports max 64 lds and uses legacy MR_FW_RAID_MAP
1355 * - 1 - supports max MAX_LOGICAL_DRIVES_EXT lds and
1372 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for map info\n"); in megasas_get_ld_map_info()
1373 return -ENOMEM; in megasas_get_ld_map_info()
1376 fusion = instance->ctrl_context; in megasas_get_ld_map_info()
1380 return -ENXIO; in megasas_get_ld_map_info()
1383 dcmd = &cmd->frame->dcmd; in megasas_get_ld_map_info()
1385 size_map_info = fusion->current_map_sz; 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()
1393 return -ENOMEM; in megasas_get_ld_map_info()
1396 memset(ci, 0, fusion->max_map_sz); in megasas_get_ld_map_info()
1397 memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE); in megasas_get_ld_map_info()
1398 dcmd->cmd = MFI_CMD_DCMD; in megasas_get_ld_map_info()
1399 dcmd->cmd_status = 0xFF; in megasas_get_ld_map_info()
1400 dcmd->sge_count = 1; in megasas_get_ld_map_info()
1401 dcmd->flags = MFI_FRAME_DIR_READ; in megasas_get_ld_map_info()
1402 dcmd->timeout = 0; in megasas_get_ld_map_info()
1403 dcmd->pad_0 = 0; in megasas_get_ld_map_info()
1404 dcmd->data_xfer_len = cpu_to_le32(size_map_info); in megasas_get_ld_map_info()
1405 dcmd->opcode = cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO); in megasas_get_ld_map_info()
1409 if (!instance->mask_interrupts) in megasas_get_ld_map_info()
1416 dev_warn(&instance->pdev->dev, in megasas_get_ld_map_info()
1428 struct fusion_context *fusion = instance->ctrl_context; in megasas_get_map_info()
1430 fusion->fast_path_io = 0; in megasas_get_map_info()
1432 if (MR_ValidateMapInfo(instance, instance->map_id)) { in megasas_get_map_info()
1433 fusion->fast_path_io = 1; in megasas_get_map_info()
1441 * megasas_sync_map_info - Returns FW's ld_map structure
1466 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get cmd for sync info\n"); in megasas_sync_map_info()
1467 return -ENOMEM; in megasas_sync_map_info()
1470 fusion = instance->ctrl_context; in megasas_sync_map_info()
1477 map = fusion->ld_drv_map[instance->map_id & 1]; in megasas_sync_map_info()
1479 num_lds = le16_to_cpu(map->raidMap.ldCount); in megasas_sync_map_info()
1481 dcmd = &cmd->frame->dcmd; in megasas_sync_map_info()
1483 memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE); in megasas_sync_map_info()
1486 fusion->ld_map[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1487 memset(ci, 0, fusion->max_map_sz); in megasas_sync_map_info()
1489 ci_h = fusion->ld_map_phys[(instance->map_id - 1) & 1]; in megasas_sync_map_info()
1495 ld_sync->targetId = MR_GetLDTgtId(i, map); in megasas_sync_map_info()
1496 ld_sync->seqNum = raid->seqNum; in megasas_sync_map_info()
1499 size_map_info = fusion->current_map_sz; in megasas_sync_map_info()
1501 dcmd->cmd = MFI_CMD_DCMD; in megasas_sync_map_info()
1502 dcmd->cmd_status = 0xFF; in megasas_sync_map_info()
1503 dcmd->sge_count = 1; in megasas_sync_map_info()
1504 dcmd->flags = MFI_FRAME_DIR_WRITE; in megasas_sync_map_info()
1505 dcmd->timeout = 0; in megasas_sync_map_info()
1506 dcmd->pad_0 = 0; in megasas_sync_map_info()
1507 dcmd->data_xfer_len = cpu_to_le32(size_map_info); in megasas_sync_map_info()
1508 dcmd->mbox.b[0] = num_lds; in megasas_sync_map_info()
1509 dcmd->mbox.b[1] = MEGASAS_DCMD_MBOX_PEND_FLAG; in megasas_sync_map_info()
1510 dcmd->opcode = cpu_to_le32(MR_DCMD_LD_MAP_GET_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()
1522 * meagasas_display_intel_branding - Display branding string
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()
1594 * megasas_allocate_raid_maps - Allocate memory for RAID maps
1598 * failed: return -ENOMEM
1605 fusion = instance->ctrl_context; in megasas_allocate_raid_maps()
1607 fusion->drv_map_pages = get_order(fusion->drv_map_sz); in megasas_allocate_raid_maps()
1610 fusion->ld_map[i] = NULL; in megasas_allocate_raid_maps()
1612 fusion->ld_drv_map[i] = (void *) in megasas_allocate_raid_maps()
1614 fusion->drv_map_pages); in megasas_allocate_raid_maps()
1616 if (!fusion->ld_drv_map[i]) { in megasas_allocate_raid_maps()
1617 fusion->ld_drv_map[i] = vzalloc(fusion->drv_map_sz); in megasas_allocate_raid_maps()
1619 if (!fusion->ld_drv_map[i]) { in megasas_allocate_raid_maps()
1620 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1623 fusion->drv_map_sz); in megasas_allocate_raid_maps()
1630 fusion->ld_map[i] = dma_alloc_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1631 fusion->max_map_sz, in megasas_allocate_raid_maps()
1632 &fusion->ld_map_phys[i], in megasas_allocate_raid_maps()
1634 if (!fusion->ld_map[i]) { in megasas_allocate_raid_maps()
1635 dev_err(&instance->pdev->dev, in megasas_allocate_raid_maps()
1646 if (fusion->ld_map[i]) in megasas_allocate_raid_maps()
1647 dma_free_coherent(&instance->pdev->dev, in megasas_allocate_raid_maps()
1648 fusion->max_map_sz, in megasas_allocate_raid_maps()
1649 fusion->ld_map[i], in megasas_allocate_raid_maps()
1650 fusion->ld_map_phys[i]); in megasas_allocate_raid_maps()
1655 if (fusion->ld_drv_map[i]) { in megasas_allocate_raid_maps()
1656 if (is_vmalloc_addr(fusion->ld_drv_map[i])) in megasas_allocate_raid_maps()
1657 vfree(fusion->ld_drv_map[i]); in megasas_allocate_raid_maps()
1659 free_pages((ulong)fusion->ld_drv_map[i], in megasas_allocate_raid_maps()
1660 fusion->drv_map_pages); in megasas_allocate_raid_maps()
1664 return -ENOMEM; in megasas_allocate_raid_maps()
1668 * megasas_configure_queue_sizes - Calculate size of request desc queue,
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()
1692 fusion->reply_q_depth = 2 * ((max_cmd + 1 + 15) / 16) * 16; in megasas_configure_queue_sizes()
1694 fusion->request_alloc_sz = sizeof(union MEGASAS_REQUEST_DESCRIPTOR_UNION) * in megasas_configure_queue_sizes()
1695 instance->max_mpt_cmds; in megasas_configure_queue_sizes()
1696 fusion->reply_alloc_sz = sizeof(union MPI2_REPLY_DESCRIPTORS_UNION) * in megasas_configure_queue_sizes()
1697 (fusion->reply_q_depth); in megasas_configure_queue_sizes()
1698 fusion->io_frames_alloc_sz = MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE + in megasas_configure_queue_sizes()
1700 * (instance->max_mpt_cmds + 1)); /* Extra 1 for SMID 0 */ in megasas_configure_queue_sizes()
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()
1715 return -ENOMEM; in megasas_alloc_ioc_init_frame()
1718 cmd->frame = dma_alloc_coherent(&instance->pdev->dev, in megasas_alloc_ioc_init_frame()
1720 &cmd->frame_phys_addr, GFP_KERNEL); in megasas_alloc_ioc_init_frame()
1722 if (!cmd->frame) { 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()
1726 return -ENOMEM; in megasas_alloc_ioc_init_frame()
1729 fusion->ioc_init_cmd = cmd; in megasas_alloc_ioc_init_frame()
1734 * megasas_free_ioc_init_cmd - Free IOC INIT command frame
1741 fusion = instance->ctrl_context; in megasas_free_ioc_init_cmd()
1743 if (fusion->ioc_init_cmd && fusion->ioc_init_cmd->frame) in megasas_free_ioc_init_cmd()
1744 dma_free_coherent(&instance->pdev->dev, in megasas_free_ioc_init_cmd()
1746 fusion->ioc_init_cmd->frame, in megasas_free_ioc_init_cmd()
1747 fusion->ioc_init_cmd->frame_phys_addr); in megasas_free_ioc_init_cmd()
1749 kfree(fusion->ioc_init_cmd); in megasas_free_ioc_init_cmd()
1753 * megasas_init_adapter_fusion - Initializes the FW
1766 fusion = instance->ctrl_context; in megasas_init_adapter_fusion()
1773 instance->max_mfi_cmds = in megasas_init_adapter_fusion()
1779 &instance->reg_set->outbound_scratch_pad_1); in megasas_init_adapter_fusion()
1783 * Legacy Firmware - Frame size is (8 * 128) = 1K in megasas_init_adapter_fusion()
1784 * 1M IO Firmware - Frame size is (8 * 128 * 4) = 4K 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()
1802 fusion->max_sge_in_main_msg = in megasas_init_adapter_fusion()
1804 - offsetof(struct MPI2_RAID_SCSI_IO_REQUEST, SGL))/16; in megasas_init_adapter_fusion()
1806 fusion->max_sge_in_chain = 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()
1811 rounddown_pow_of_two(fusion->max_sge_in_main_msg in megasas_init_adapter_fusion()
1812 + fusion->max_sge_in_chain - 2); in megasas_init_adapter_fusion()
1815 fusion->chain_offset_mfi_pthru = in megasas_init_adapter_fusion()
1818 fusion->chain_offset_io_request = in megasas_init_adapter_fusion()
1819 (MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE - in megasas_init_adapter_fusion()
1822 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_init_adapter_fusion()
1824 fusion->last_reply_idx[i] = 0; 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()
1848 status_reg = instance->instancet->read_fw_status_reg(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()
1874 fusion->fast_path_io = 0; in megasas_init_adapter_fusion()
1894 * megasas_fault_detect_work - Worker function of
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()
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()
1922 "Failed from %s %d, do not re-arm timer\n", 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()
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()
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()
1979 * map_cmd_status - Maps FW cmd status to OS cmd status
1999 scmd->result = DID_OK << 16; in map_cmd_status()
2004 scmd->result = (DID_ERROR << 16) | ext_status; in map_cmd_status()
2009 scmd->result = (DID_OK << 16) | ext_status; in map_cmd_status()
2011 memset(scmd->sense_buffer, 0, in map_cmd_status()
2013 memcpy(scmd->sense_buffer, sense, in map_cmd_status()
2015 scmd->result |= DRIVER_SENSE << 24; in map_cmd_status()
2020 * update "io_request->DataLength" field with actual number of in map_cmd_status()
2024 resid = (scsi_bufflen(scmd) - data_length); in map_cmd_status()
2037 scmd->result = DID_BAD_TARGET << 16; in map_cmd_status()
2040 scmd->result = DID_IMM_RETRY << 16; in map_cmd_status()
2043 scmd->result = DID_ERROR << 16; in map_cmd_status()
2049 * megasas_is_prp_possible -
2053 * @scmd: SCSI command from the mid-layer
2068 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_is_prp_possible()
2075 * look at the data length - if 4 pages or less then IEEE is OK in megasas_is_prp_possible()
2087 if (sg_dma_len(sg_scmd) < (data_length - (mr_nvme_pg_size * 4))) in megasas_is_prp_possible()
2095 * megasas_make_prp_nvme -
2096 * Prepare PRPs(Physical Region Page)- SGLs specific to NVMe drives only
2099 * @scmd: SCSI command from the mid-layer
2122 u32 mr_nvme_pg_size = max_t(u32, instance->nvme_page_size, in megasas_make_prp_nvme()
2132 * for each page or partial page. Driver need to split up OS sg_list in megasas_make_prp_nvme()
2142 page_mask = mr_nvme_pg_size - 1; in megasas_make_prp_nvme()
2143 ptr_sgl = (u64 *)cmd->sg_frame; in megasas_make_prp_nvme()
2144 ptr_sgl_phys = cmd->sg_frame_phys_addr; in megasas_make_prp_nvme()
2145 memset(ptr_sgl, 0, instance->max_chain_frame_sz); in megasas_make_prp_nvme()
2151 main_chain_element->Address = cpu_to_le64(ptr_sgl_phys); in megasas_make_prp_nvme()
2152 main_chain_element->NextChainOffset = 0; in megasas_make_prp_nvme()
2153 main_chain_element->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT | in megasas_make_prp_nvme()
2164 first_prp_len = mr_nvme_pg_size - offset; in megasas_make_prp_nvme()
2166 ptr_first_sgl->Address = cpu_to_le64(sge_addr); in megasas_make_prp_nvme()
2167 ptr_first_sgl->Length = cpu_to_le32(first_prp_len); in megasas_make_prp_nvme()
2169 data_len -= first_prp_len; in megasas_make_prp_nvme()
2173 sge_len -= first_prp_len; in megasas_make_prp_nvme()
2201 sge_len -= mr_nvme_pg_size; in megasas_make_prp_nvme()
2202 data_len -= mr_nvme_pg_size; in megasas_make_prp_nvme()
2215 main_chain_element->Length = in megasas_make_prp_nvme()
2222 * megasas_make_sgl_fusion - Prepares 32-bit SGL
2224 * @scp: SCSI command from the mid-layer
2240 fusion = instance->ctrl_context; in megasas_make_sgl_fusion()
2242 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2244 sgl_ptr_end += fusion->max_sge_in_main_msg - 1; in megasas_make_sgl_fusion()
2245 sgl_ptr_end->Flags = 0; in megasas_make_sgl_fusion()
2249 sgl_ptr->Length = cpu_to_le32(sg_dma_len(os_sgl)); in megasas_make_sgl_fusion()
2250 sgl_ptr->Address = cpu_to_le64(sg_dma_address(os_sgl)); in megasas_make_sgl_fusion()
2251 sgl_ptr->Flags = 0; in megasas_make_sgl_fusion()
2252 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2253 if (i == sge_count - 1) in megasas_make_sgl_fusion()
2254 sgl_ptr->Flags = IEEE_SGE_FLAGS_END_OF_LIST; in megasas_make_sgl_fusion()
2258 if ((sg_processed == (fusion->max_sge_in_main_msg - 1)) && in megasas_make_sgl_fusion()
2259 (sge_count > fusion->max_sge_in_main_msg)) { in megasas_make_sgl_fusion()
2262 if (instance->adapter_type >= INVADER_SERIES) { in megasas_make_sgl_fusion()
2263 if ((le16_to_cpu(cmd->io_request->IoFlags) & in megasas_make_sgl_fusion()
2266 cmd->io_request->ChainOffset = in megasas_make_sgl_fusion()
2267 fusion-> in megasas_make_sgl_fusion()
2270 cmd->io_request->ChainOffset = 0; in megasas_make_sgl_fusion()
2272 cmd->io_request->ChainOffset = in megasas_make_sgl_fusion()
2273 fusion->chain_offset_io_request; in megasas_make_sgl_fusion()
2277 sg_chain->NextChainOffset = 0; in megasas_make_sgl_fusion()
2278 if (instance->adapter_type >= INVADER_SERIES) in megasas_make_sgl_fusion()
2279 sg_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT; in megasas_make_sgl_fusion()
2281 sg_chain->Flags = in megasas_make_sgl_fusion()
2284 sg_chain->Length = cpu_to_le32((sizeof(union MPI2_SGE_IO_UNION) * (sge_count - sg_processed))); in megasas_make_sgl_fusion()
2285 sg_chain->Address = cpu_to_le64(cmd->sg_frame_phys_addr); in megasas_make_sgl_fusion()
2288 (struct MPI25_IEEE_SGE_CHAIN64 *)cmd->sg_frame; in megasas_make_sgl_fusion()
2289 memset(sgl_ptr, 0, instance->max_chain_frame_sz); in megasas_make_sgl_fusion()
2295 * megasas_make_sgl - Build Scatter Gather List(SGLs)
2302 * format- PRPs(Physical Region Page).
2305 * is NULL, or -ENOMEM if the mapping failed
2317 if ((sge_count > instance->max_num_sge) || (sge_count <= 0)) in megasas_make_sgl()
2320 sgl_chain64 = (struct MPI25_IEEE_SGE_CHAIN64 *)&cmd->io_request->SGL; in megasas_make_sgl()
2321 if ((le16_to_cpu(cmd->io_request->IoFlags) & in megasas_make_sgl()
2323 (cmd->pd_interface == NVME_PD)) in megasas_make_sgl()
2335 * megasas_set_pd_lba - Sets PD LBA
2352 u64 start_blk = io_info->pdBlock; in megasas_set_pd_lba()
2353 u8 *cdb = io_request->CDB.CDB32; in megasas_set_pd_lba()
2354 u32 num_blocks = io_info->numBlocks; in megasas_set_pd_lba()
2358 ld = MR_TargetIdToLdGet(io_info->ldTgtId, local_map_ptr); in megasas_set_pd_lba()
2360 if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER) { in megasas_set_pd_lba()
2361 memset(cdb, 0, sizeof(io_request->CDB.CDB32)); in megasas_set_pd_lba()
2365 if (scp->sc_data_direction == DMA_FROM_DEVICE) in megasas_set_pd_lba()
2382 io_request->CDB.EEDP32.PrimaryReferenceTag = in megasas_set_pd_lba()
2384 io_request->CDB.EEDP32.PrimaryApplicationTagMask = cpu_to_be16(0xffff); in megasas_set_pd_lba()
2385 io_request->IoFlags = cpu_to_le16(32); /* Specify 32-byte cdb */ in megasas_set_pd_lba()
2394 if (scp->sc_data_direction == DMA_FROM_DEVICE) { in megasas_set_pd_lba()
2395 io_request->EEDPFlags = cpu_to_le16( in megasas_set_pd_lba()
2403 io_request->EEDPFlags = cpu_to_le16( in megasas_set_pd_lba()
2407 io_request->Control |= cpu_to_le32((0x4 << 26)); in megasas_set_pd_lba()
2408 io_request->EEDPBlockSize = cpu_to_le32(scp->device->sector_size); in megasas_set_pd_lba()
2425 memset(cdb, 0, sizeof(io_request->CDB.CDB32)); in megasas_set_pd_lba()
2436 io_request->IoFlags = cpu_to_le16(10); /* Specify 10-byte cdb */ in megasas_set_pd_lba()
2461 memset(cdb, 0, sizeof(io_request->CDB.CDB32)); in megasas_set_pd_lba()
2474 io_request->IoFlags = cpu_to_le16(16); /* Specify 16-byte cdb */ in megasas_set_pd_lba()
2515 * megasas_stream_detect - stream detection on read and and write IOs
2527 struct fusion_context *fusion = instance->ctrl_context; in megasas_stream_detect()
2528 u32 device_id = io_info->ldTgtId; in megasas_stream_detect()
2530 = fusion->stream_detect_by_ld[device_id]; in megasas_stream_detect()
2531 u32 *track_stream = ¤t_ld_sd->mru_bit_map, stream_num; in megasas_stream_detect()
2542 current_sd = ¤t_ld_sd->stream_track[stream_num]; in megasas_stream_detect()
2547 if ((current_sd->next_seq_lba) && in megasas_stream_detect()
2548 (io_info->ldStartBlock >= current_sd->next_seq_lba) && in megasas_stream_detect()
2549 (io_info->ldStartBlock <= (current_sd->next_seq_lba + 32)) && in megasas_stream_detect()
2550 (current_sd->is_read == io_info->isRead)) { in megasas_stream_detect()
2552 if ((io_info->ldStartBlock != current_sd->next_seq_lba) && in megasas_stream_detect()
2553 ((!io_info->isRead) || (!is_read_ahead))) in megasas_stream_detect()
2560 SET_STREAM_DETECTED(cmd->io_request->RaidContext.raid_context_g35); in megasas_stream_detect()
2561 current_sd->next_seq_lba = in megasas_stream_detect()
2562 io_info->ldStartBlock + io_info->numBlocks; in megasas_stream_detect()
2567 (1 << i * BITS_PER_INDEX_STREAM) - 1; in megasas_stream_detect()
2585 ((MAX_STREAMS_TRACKED - 1) * BITS_PER_INDEX_STREAM)) & in megasas_stream_detect()
2587 current_sd = ¤t_ld_sd->stream_track[stream_num]; in megasas_stream_detect()
2588 current_sd->is_read = io_info->isRead; in megasas_stream_detect()
2589 current_sd->next_seq_lba = io_info->ldStartBlock + io_info->numBlocks; in megasas_stream_detect()
2595 * megasas_set_raidflag_cpu_affinity - This function sets the cpu
2616 rctx_g35 = &praid_context->raid_context_g35; in megasas_set_raidflag_cpu_affinity()
2619 if ((raid->cpuAffinity.pdRead.cpu0) && in megasas_set_raidflag_cpu_affinity()
2620 (raid->cpuAffinity.pdRead.cpu1)) in megasas_set_raidflag_cpu_affinity()
2622 else if (raid->cpuAffinity.pdRead.cpu1) in megasas_set_raidflag_cpu_affinity()
2625 if ((raid->cpuAffinity.pdWrite.cpu0) && in megasas_set_raidflag_cpu_affinity()
2626 (raid->cpuAffinity.pdWrite.cpu1)) in megasas_set_raidflag_cpu_affinity()
2628 else if (raid->cpuAffinity.pdWrite.cpu1) in megasas_set_raidflag_cpu_affinity()
2631 if ((raid->level <= 1) && in megasas_set_raidflag_cpu_affinity()
2632 (raid->capability.fp_cache_bypass_capable)) { in megasas_set_raidflag_cpu_affinity()
2633 rctx_g35->routing_flags |= in megasas_set_raidflag_cpu_affinity()
2635 rctx_g35->raid_flags = in megasas_set_raidflag_cpu_affinity()
2642 if ((raid->cpuAffinity.ldRead.cpu0) && in megasas_set_raidflag_cpu_affinity()
2643 (raid->cpuAffinity.ldRead.cpu1)) in megasas_set_raidflag_cpu_affinity()
2645 else if (raid->cpuAffinity.ldRead.cpu1) in megasas_set_raidflag_cpu_affinity()
2648 if ((raid->cpuAffinity.ldWrite.cpu0) && in megasas_set_raidflag_cpu_affinity()
2649 (raid->cpuAffinity.ldWrite.cpu1)) in megasas_set_raidflag_cpu_affinity()
2651 else if (raid->cpuAffinity.ldWrite.cpu1) in megasas_set_raidflag_cpu_affinity()
2655 ((raid->level == 5) || (raid->level == 6)) && in megasas_set_raidflag_cpu_affinity()
2656 (raid->writeMode == MR_RL_WRITE_THROUGH_MODE) && in megasas_set_raidflag_cpu_affinity()
2662 rctx_g35->routing_flags |= in megasas_set_raidflag_cpu_affinity()
2669 if ((fusion->pcie_bw_limitation) && (raid->level == 1) && (!is_read) && in megasas_set_raidflag_cpu_affinity()
2671 praid_context->raid_context_g35.raid_flags = in megasas_set_raidflag_cpu_affinity()
2678 * megasas_build_ldio_fusion - Prepares IOs to devices
2708 fusion = instance->ctrl_context; in megasas_build_ldio_fusion()
2710 io_request = cmd->io_request; in megasas_build_ldio_fusion()
2711 rctx = &io_request->RaidContext.raid_context; in megasas_build_ldio_fusion()
2712 rctx_g35 = &io_request->RaidContext.raid_context_g35; in megasas_build_ldio_fusion()
2714 rctx->virtual_disk_tgt_id = cpu_to_le16(device_id); in megasas_build_ldio_fusion()
2715 rctx->status = 0; in megasas_build_ldio_fusion()
2716 rctx->ex_status = 0; in megasas_build_ldio_fusion()
2723 * 6-byte READ(0x08) or WRITE(0x0A) cdb in megasas_build_ldio_fusion()
2725 if (scp->cmd_len == 6) { in megasas_build_ldio_fusion()
2726 datalength = (u32) scp->cmnd[4]; in megasas_build_ldio_fusion()
2727 start_lba_lo = ((u32) scp->cmnd[1] << 16) | in megasas_build_ldio_fusion()
2728 ((u32) scp->cmnd[2] << 8) | (u32) scp->cmnd[3]; in megasas_build_ldio_fusion()
2734 * 10-byte READ(0x28) or WRITE(0x2A) cdb in megasas_build_ldio_fusion()
2736 else if (scp->cmd_len == 10) { in megasas_build_ldio_fusion()
2737 datalength = (u32) scp->cmnd[8] | in megasas_build_ldio_fusion()
2738 ((u32) scp->cmnd[7] << 8); in megasas_build_ldio_fusion()
2739 start_lba_lo = ((u32) scp->cmnd[2] << 24) | in megasas_build_ldio_fusion()
2740 ((u32) scp->cmnd[3] << 16) | in megasas_build_ldio_fusion()
2741 ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5]; in megasas_build_ldio_fusion()
2745 * 12-byte READ(0xA8) or WRITE(0xAA) cdb in megasas_build_ldio_fusion()
2747 else if (scp->cmd_len == 12) { in megasas_build_ldio_fusion()
2748 datalength = ((u32) scp->cmnd[6] << 24) | in megasas_build_ldio_fusion()
2749 ((u32) scp->cmnd[7] << 16) | in megasas_build_ldio_fusion()
2750 ((u32) scp->cmnd[8] << 8) | (u32) scp->cmnd[9]; in megasas_build_ldio_fusion()
2751 start_lba_lo = ((u32) scp->cmnd[2] << 24) | in megasas_build_ldio_fusion()
2752 ((u32) scp->cmnd[3] << 16) | in megasas_build_ldio_fusion()
2753 ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5]; in megasas_build_ldio_fusion()
2757 * 16-byte READ(0x88) or WRITE(0x8A) cdb in megasas_build_ldio_fusion()
2759 else if (scp->cmd_len == 16) { in megasas_build_ldio_fusion()
2760 datalength = ((u32) scp->cmnd[10] << 24) | in megasas_build_ldio_fusion()
2761 ((u32) scp->cmnd[11] << 16) | in megasas_build_ldio_fusion()
2762 ((u32) scp->cmnd[12] << 8) | (u32) scp->cmnd[13]; in megasas_build_ldio_fusion()
2763 start_lba_lo = ((u32) scp->cmnd[6] << 24) | in megasas_build_ldio_fusion()
2764 ((u32) scp->cmnd[7] << 16) | in megasas_build_ldio_fusion()
2765 ((u32) scp->cmnd[8] << 8) | (u32) scp->cmnd[9]; in megasas_build_ldio_fusion()
2767 start_lba_hi = ((u32) scp->cmnd[2] << 24) | in megasas_build_ldio_fusion()
2768 ((u32) scp->cmnd[3] << 16) | in megasas_build_ldio_fusion()
2769 ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5]; in megasas_build_ldio_fusion()
2778 io_request->DataLength = cpu_to_le32(scsi_buff_len); in megasas_build_ldio_fusion()
2781 if (scp->sc_data_direction == DMA_FROM_DEVICE) 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()
2790 if (!raid || (!fusion->fast_path_io)) { in megasas_build_ldio_fusion()
2791 rctx->reg_lock_flags = 0; in megasas_build_ldio_fusion()
2801 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2803 * All large RAID-1 writes (> 32 KiB, both WT and WB modes) in megasas_build_ldio_fusion()
2804 * are built by the driver as LD I/Os. in megasas_build_ldio_fusion()
2805 * All small RAID-1 WT writes (<= 32 KiB) are built as FP I/Os in megasas_build_ldio_fusion()
2807 * All small RAID-1 WB writes (<= 32 KiB) are built as FP I/Os in megasas_build_ldio_fusion()
2811 mrdev_priv = scp->device->hostdata; 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()
2817 } else if (fusion->pcie_bw_limitation && in megasas_build_ldio_fusion()
2819 (atomic_dec_if_positive(&mrdev_priv->r1_ldio_hint) > 0))) { in megasas_build_ldio_fusion()
2821 atomic_dec(&instance->fw_outstanding); in megasas_build_ldio_fusion()
2823 atomic_set(&mrdev_priv->r1_ldio_hint, 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()
2833 spin_unlock_irqrestore(&instance->stream_lock, in megasas_build_ldio_fusion()
2844 megasas_set_raidflag_cpu_affinity(fusion, &io_request->RaidContext, in megasas_build_ldio_fusion()
2848 rctx_g35->routing_flags |= in megasas_build_ldio_fusion()
2853 megasas_set_pd_lba(io_request, scp->cmd_len, &io_info, scp, in megasas_build_ldio_fusion()
2855 io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; in megasas_build_ldio_fusion()
2856 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_ldio_fusion()
2859 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2860 rctx->type = MPI2_TYPE_CUDA; in megasas_build_ldio_fusion()
2861 rctx->nseg = 0x1; in megasas_build_ldio_fusion()
2862 io_request->IoFlags |= cpu_to_le16(MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH); in megasas_build_ldio_fusion()
2863 rctx->reg_lock_flags |= in megasas_build_ldio_fusion()
2866 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2867 rctx_g35->nseg_type |= (1 << RAID_CONTEXT_NSEG_SHIFT); in megasas_build_ldio_fusion()
2868 rctx_g35->nseg_type |= (MPI2_TYPE_CUDA << RAID_CONTEXT_TYPE_SHIFT); in megasas_build_ldio_fusion()
2869 rctx_g35->routing_flags |= (1 << MR_RAID_CTX_ROUTINGFLAGS_SQN_SHIFT); in megasas_build_ldio_fusion()
2870 io_request->IoFlags |= in megasas_build_ldio_fusion()
2873 if (fusion->load_balance_info && in megasas_build_ldio_fusion()
2874 (fusion->load_balance_info[device_id].loadBalanceFlag) && in megasas_build_ldio_fusion()
2878 &fusion->load_balance_info[device_id], in megasas_build_ldio_fusion()
2880 scp->SCp.Status |= MEGASAS_LOAD_BALANCE_FLAG; in megasas_build_ldio_fusion()
2881 cmd->pd_r1_lb = io_info.pd_after_lb; in megasas_build_ldio_fusion()
2882 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2883 rctx_g35->span_arm = io_info.span_arm; in megasas_build_ldio_fusion()
2885 rctx->span_arm = io_info.span_arm; in megasas_build_ldio_fusion()
2888 scp->SCp.Status &= ~MEGASAS_LOAD_BALANCE_FLAG; in megasas_build_ldio_fusion()
2890 if (instance->adapter_type >= VENTURA_SERIES) in megasas_build_ldio_fusion()
2891 cmd->r1_alt_dev_handle = io_info.r1_alt_dev_handle; in megasas_build_ldio_fusion()
2893 cmd->r1_alt_dev_handle = MR_DEVHANDLE_INVALID; in megasas_build_ldio_fusion()
2896 (local_map_ptr->raidMap.devHndlInfo[io_info.pd_after_lb].validHandles > 1)) { 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()
2902 cmd->request_desc->SCSIIO.DevHandle = io_info.devHandle; in megasas_build_ldio_fusion()
2903 io_request->DevHandle = io_info.devHandle; in megasas_build_ldio_fusion()
2904 cmd->pd_interface = io_info.pd_interface; in megasas_build_ldio_fusion()
2906 memcpy(io_request->LUN, raidLUN, 8); in megasas_build_ldio_fusion()
2908 rctx->timeout_value = in megasas_build_ldio_fusion()
2909 cpu_to_le16(local_map_ptr->raidMap.fpPdIoTimeoutSec); in megasas_build_ldio_fusion()
2910 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_ldio_fusion()
2913 if (instance->adapter_type == INVADER_SERIES) { in megasas_build_ldio_fusion()
2915 (rctx->reg_lock_flags == REGION_TYPE_UNUSED)) in megasas_build_ldio_fusion()
2916 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_ldio_fusion()
2919 rctx->type = MPI2_TYPE_CUDA; in megasas_build_ldio_fusion()
2920 rctx->reg_lock_flags |= in megasas_build_ldio_fusion()
2923 rctx->nseg = 0x1; in megasas_build_ldio_fusion()
2924 } else if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_ldio_fusion()
2925 rctx_g35->routing_flags |= (1 << MR_RAID_CTX_ROUTINGFLAGS_SQN_SHIFT); in megasas_build_ldio_fusion()
2926 rctx_g35->nseg_type |= (1 << RAID_CONTEXT_NSEG_SHIFT); in megasas_build_ldio_fusion()
2927 rctx_g35->nseg_type |= (MPI2_TYPE_CUDA << RAID_CONTEXT_TYPE_SHIFT); in megasas_build_ldio_fusion()
2929 io_request->Function = MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST; in megasas_build_ldio_fusion()
2930 io_request->DevHandle = cpu_to_le16(device_id); in megasas_build_ldio_fusion()
2936 * megasas_build_ld_nonrw_fusion - prepares non rw ios for virtual disk
2941 * Prepares the io_request frame for non-rw io cmds for vd.
2950 struct fusion_context *fusion = instance->ctrl_context; in megasas_build_ld_nonrw_fusion()
2958 io_request = cmd->io_request; in megasas_build_ld_nonrw_fusion()
2960 local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_ld_nonrw_fusion()
2961 io_request->DataLength = cpu_to_le32(scsi_bufflen(scmd)); in megasas_build_ld_nonrw_fusion()
2963 pRAID_Context = &io_request->RaidContext.raid_context; in megasas_build_ld_nonrw_fusion()
2965 pRAID_Context->virtual_disk_tgt_id = cpu_to_le16(device_id); in megasas_build_ld_nonrw_fusion()
2966 pRAID_Context->reg_lock_row_lba = 0; in megasas_build_ld_nonrw_fusion()
2967 pRAID_Context->reg_lock_length = 0; in megasas_build_ld_nonrw_fusion()
2969 if (fusion->fast_path_io && ( 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()
2977 if (!(raid->capability.fpNonRWCapable)) in megasas_build_ld_nonrw_fusion()
2984 io_request->Function = MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST; in megasas_build_ld_nonrw_fusion()
2985 io_request->DevHandle = cpu_to_le16(device_id); in megasas_build_ld_nonrw_fusion()
2986 io_request->LUN[1] = scmd->device->lun; in megasas_build_ld_nonrw_fusion()
2987 pRAID_Context->timeout_value = in megasas_build_ld_nonrw_fusion()
2988 cpu_to_le16 (scmd->request->timeout / HZ); in megasas_build_ld_nonrw_fusion()
2989 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_ld_nonrw_fusion()
2995 pRAID_Context->config_seq_num = raid->seqNum; in megasas_build_ld_nonrw_fusion()
2996 if (instance->adapter_type < VENTURA_SERIES) in megasas_build_ld_nonrw_fusion()
2997 pRAID_Context->reg_lock_flags = REGION_TYPE_SHARED_READ; in megasas_build_ld_nonrw_fusion()
2998 pRAID_Context->timeout_value = in megasas_build_ld_nonrw_fusion()
2999 cpu_to_le16(raid->fpIoTimeoutForLd); in megasas_build_ld_nonrw_fusion()
3009 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_ld_nonrw_fusion()
3012 cmd->request_desc->SCSIIO.DevHandle = devHandle; in megasas_build_ld_nonrw_fusion()
3015 memcpy(io_request->LUN, raid->LUN, 8); in megasas_build_ld_nonrw_fusion()
3018 io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; in megasas_build_ld_nonrw_fusion()
3019 io_request->DevHandle = devHandle; in megasas_build_ld_nonrw_fusion()
3024 * megasas_build_syspd_fusion - prepares rw/non-rw ios for syspd
3030 * Prepares the io_request frame for rw/non-rw io cmds for syspds
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()
3051 os_timeout_value = scmd->request->timeout / HZ; in megasas_build_syspd_fusion()
3052 mr_device_priv_data = scmd->device->hostdata; in megasas_build_syspd_fusion()
3053 cmd->pd_interface = mr_device_priv_data->interface_type; in megasas_build_syspd_fusion()
3055 io_request = cmd->io_request; in megasas_build_syspd_fusion()
3057 pRAID_Context = &io_request->RaidContext.raid_context; in megasas_build_syspd_fusion()
3058 pRAID_Context->reg_lock_flags = 0; in megasas_build_syspd_fusion()
3059 pRAID_Context->reg_lock_row_lba = 0; in megasas_build_syspd_fusion()
3060 pRAID_Context->reg_lock_length = 0; in megasas_build_syspd_fusion()
3061 io_request->DataLength = cpu_to_le32(scsi_bufflen(scmd)); in megasas_build_syspd_fusion()
3062 io_request->LUN[1] = scmd->device->lun; in megasas_build_syspd_fusion()
3063 pRAID_Context->raid_flags = MR_RAID_FLAGS_IO_SUB_TYPE_SYSTEM_PD 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()
3073 pRAID_Context->virtual_disk_tgt_id = in megasas_build_syspd_fusion()
3074 pd_sync->seq[pd_index].pd_target_id; in megasas_build_syspd_fusion()
3076 pRAID_Context->virtual_disk_tgt_id = in megasas_build_syspd_fusion()
3078 (MAX_PHYSICAL_DEVICES - 1)); in megasas_build_syspd_fusion()
3079 pRAID_Context->config_seq_num = in megasas_build_syspd_fusion()
3080 pd_sync->seq[pd_index].seqNum; in megasas_build_syspd_fusion()
3081 io_request->DevHandle = in megasas_build_syspd_fusion()
3082 pd_sync->seq[pd_index].devHandle; in megasas_build_syspd_fusion()
3083 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_build_syspd_fusion()
3084 io_request->RaidContext.raid_context_g35.routing_flags |= in megasas_build_syspd_fusion()
3086 io_request->RaidContext.raid_context_g35.nseg_type |= in megasas_build_syspd_fusion()
3088 io_request->RaidContext.raid_context_g35.nseg_type |= in megasas_build_syspd_fusion()
3091 pRAID_Context->type = MPI2_TYPE_CUDA; in megasas_build_syspd_fusion()
3092 pRAID_Context->nseg = 0x1; in megasas_build_syspd_fusion()
3093 pRAID_Context->reg_lock_flags |= in megasas_build_syspd_fusion()
3098 pRAID_Context->virtual_disk_tgt_id = in megasas_build_syspd_fusion()
3100 (MAX_PHYSICAL_DEVICES - 1)); in megasas_build_syspd_fusion()
3101 pRAID_Context->config_seq_num = 0; in megasas_build_syspd_fusion()
3102 io_request->DevHandle = cpu_to_le16(0xFFFF); in megasas_build_syspd_fusion()
3105 pRAID_Context->virtual_disk_tgt_id = cpu_to_le16(device_id); in megasas_build_syspd_fusion()
3106 pRAID_Context->config_seq_num = 0; in megasas_build_syspd_fusion()
3108 if (fusion->fast_path_io) { in megasas_build_syspd_fusion()
3110 fusion->ld_drv_map[(instance->map_id & 1)]; in megasas_build_syspd_fusion()
3111 io_request->DevHandle = in megasas_build_syspd_fusion()
3112 local_map_ptr->raidMap.devHndlInfo[device_id].curDevHdl; in megasas_build_syspd_fusion()
3114 io_request->DevHandle = cpu_to_le16(0xFFFF); in megasas_build_syspd_fusion()
3118 cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle; in megasas_build_syspd_fusion()
3124 io_request->Function = MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST; in megasas_build_syspd_fusion()
3125 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_syspd_fusion()
3128 pRAID_Context->timeout_value = cpu_to_le16(os_timeout_value); in megasas_build_syspd_fusion()
3129 pRAID_Context->virtual_disk_tgt_id = cpu_to_le16(device_id); in megasas_build_syspd_fusion()
3135 io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; in megasas_build_syspd_fusion()
3136 timeout_limit = (scmd->device->type == TYPE_DISK) ? in megasas_build_syspd_fusion()
3138 pRAID_Context->timeout_value = in megasas_build_syspd_fusion()
3141 if (instance->adapter_type >= INVADER_SERIES) in megasas_build_syspd_fusion()
3142 io_request->IoFlags |= in megasas_build_syspd_fusion()
3145 cmd->request_desc->SCSIIO.RequestFlags = in megasas_build_syspd_fusion()
3152 * megasas_build_io_fusion - Prepares IOs to devices
3158 * and sets flags appropriate for IO/Non-IO cmd
3167 struct MPI2_RAID_SCSI_IO_REQUEST *io_request = cmd->io_request; in megasas_build_io_fusion()
3169 mr_device_priv_data = scp->device->hostdata; in megasas_build_io_fusion()
3172 memset(io_request->LUN, 0x0, 8); in megasas_build_io_fusion()
3173 io_request->CDB.EEDP32.PrimaryReferenceTag = 0; in megasas_build_io_fusion()
3174 io_request->CDB.EEDP32.PrimaryApplicationTagMask = 0; in megasas_build_io_fusion()
3175 io_request->EEDPFlags = 0; in megasas_build_io_fusion()
3176 io_request->Control = 0; in megasas_build_io_fusion()
3177 io_request->EEDPBlockSize = 0; in megasas_build_io_fusion()
3178 io_request->ChainOffset = 0; in megasas_build_io_fusion()
3179 io_request->RaidContext.raid_context.raid_flags = 0; in megasas_build_io_fusion()
3180 io_request->RaidContext.raid_context.type = 0; in megasas_build_io_fusion()
3181 io_request->RaidContext.raid_context.nseg = 0; in megasas_build_io_fusion()
3183 memcpy(io_request->CDB.CDB32, scp->cmnd, scp->cmd_len); in megasas_build_io_fusion()
3188 io_request->IoFlags = cpu_to_le16(scp->cmd_len); in megasas_build_io_fusion()
3201 if (instance->secure_jbod_support || in megasas_build_io_fusion()
3202 mr_device_priv_data->is_tm_capable) 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()
3219 "%s %d sge_count (%d) is out of range. Range is: 0-%d\n", 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()
3225 set_num_sge(&io_request->RaidContext.raid_context_g35, sge_count); in megasas_build_io_fusion()
3226 cpu_to_le16s(&io_request->RaidContext.raid_context_g35.routing_flags); in megasas_build_io_fusion()
3227 cpu_to_le16s(&io_request->RaidContext.raid_context_g35.nseg_type); in megasas_build_io_fusion()
3232 io_request->RaidContext.raid_context.num_sge = sge_count; in megasas_build_io_fusion()
3233 io_request->RaidContext.raid_context.num_sge_ext = in megasas_build_io_fusion()
3237 io_request->SGLFlags = cpu_to_le16(MPI2_SGE_FLAGS_64_BIT_ADDRESSING); in megasas_build_io_fusion()
3239 if (scp->sc_data_direction == DMA_TO_DEVICE) in megasas_build_io_fusion()
3240 io_request->Control |= cpu_to_le32(MPI2_SCSIIO_CONTROL_WRITE); in megasas_build_io_fusion()
3241 else if (scp->sc_data_direction == DMA_FROM_DEVICE) in megasas_build_io_fusion()
3242 io_request->Control |= cpu_to_le32(MPI2_SCSIIO_CONTROL_READ); in megasas_build_io_fusion()
3244 io_request->SGLOffset0 = in megasas_build_io_fusion()
3247 io_request->SenseBufferLowAddress = in megasas_build_io_fusion()
3248 cpu_to_le32(lower_32_bits(cmd->sense_phys_addr)); in megasas_build_io_fusion()
3249 io_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE; in megasas_build_io_fusion()
3251 cmd->scmd = scp; in megasas_build_io_fusion()
3252 scp->SCp.ptr = (char *)cmd; in megasas_build_io_fusion()
3263 fusion = instance->ctrl_context; in megasas_get_request_descriptor()
3264 p = fusion->req_frames_desc + in megasas_get_request_descriptor()
3280 fusion = instance->ctrl_context; in megasas_prepare_secondRaid1_IO()
3281 req_desc = cmd->request_desc; in megasas_prepare_secondRaid1_IO()
3283 memcpy(r1_cmd->io_request, cmd->io_request, in megasas_prepare_secondRaid1_IO()
3285 memcpy(&r1_cmd->io_request->SGL, &cmd->io_request->SGL, in megasas_prepare_secondRaid1_IO()
3286 (fusion->max_sge_in_main_msg * sizeof(union MPI2_SGE_IO_UNION))); in megasas_prepare_secondRaid1_IO()
3288 r1_cmd->io_request->SenseBufferLowAddress = in megasas_prepare_secondRaid1_IO()
3289 cpu_to_le32(lower_32_bits(r1_cmd->sense_phys_addr)); in megasas_prepare_secondRaid1_IO()
3290 r1_cmd->scmd = cmd->scmd; in megasas_prepare_secondRaid1_IO()
3292 (r1_cmd->index - 1)); in megasas_prepare_secondRaid1_IO()
3293 req_desc2->Words = 0; in megasas_prepare_secondRaid1_IO()
3294 r1_cmd->request_desc = req_desc2; in megasas_prepare_secondRaid1_IO()
3295 req_desc2->SCSIIO.SMID = cpu_to_le16(r1_cmd->index); in megasas_prepare_secondRaid1_IO()
3296 req_desc2->SCSIIO.RequestFlags = req_desc->SCSIIO.RequestFlags; in megasas_prepare_secondRaid1_IO()
3297 r1_cmd->request_desc->SCSIIO.DevHandle = cmd->r1_alt_dev_handle; in megasas_prepare_secondRaid1_IO()
3298 r1_cmd->io_request->DevHandle = cmd->r1_alt_dev_handle; in megasas_prepare_secondRaid1_IO()
3299 r1_cmd->r1_alt_dev_handle = cmd->io_request->DevHandle; in megasas_prepare_secondRaid1_IO()
3300 cmd->io_request->RaidContext.raid_context_g35.flow_specific.peer_smid = in megasas_prepare_secondRaid1_IO()
3301 cpu_to_le16(r1_cmd->index); in megasas_prepare_secondRaid1_IO()
3302 r1_cmd->io_request->RaidContext.raid_context_g35.flow_specific.peer_smid = in megasas_prepare_secondRaid1_IO()
3303 cpu_to_le16(cmd->index); in megasas_prepare_secondRaid1_IO()
3305 r1_cmd->request_desc->SCSIIO.MSIxIndex = in megasas_prepare_secondRaid1_IO()
3306 cmd->request_desc->SCSIIO.MSIxIndex; in megasas_prepare_secondRaid1_IO()
3308 r1_cmd->io_request->RaidContext.raid_context_g35.span_arm = in megasas_prepare_secondRaid1_IO()
3309 cmd->io_request->RaidContext.raid_context_g35.span_arm + 1; in megasas_prepare_secondRaid1_IO()
3313 * megasas_build_and_issue_cmd_fusion -Main routine for building and
3316 * @scmd: pointer to scsi cmd from OS
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()
3347 index = cmd->index; in megasas_build_and_issue_cmd_fusion()
3349 req_desc = megasas_get_request_descriptor(instance, index-1); in megasas_build_and_issue_cmd_fusion()
3351 req_desc->Words = 0; in megasas_build_and_issue_cmd_fusion()
3352 cmd->request_desc = req_desc; in megasas_build_and_issue_cmd_fusion()
3356 dev_err(&instance->pdev->dev, "Error building command\n"); in megasas_build_and_issue_cmd_fusion()
3357 cmd->request_desc = NULL; in megasas_build_and_issue_cmd_fusion()
3358 atomic_dec(&instance->fw_outstanding); in megasas_build_and_issue_cmd_fusion()
3362 req_desc = cmd->request_desc; in megasas_build_and_issue_cmd_fusion()
3363 req_desc->SCSIIO.SMID = cpu_to_le16(index); in megasas_build_and_issue_cmd_fusion()
3365 if (cmd->io_request->ChainOffset != 0 && in megasas_build_and_issue_cmd_fusion()
3366 cmd->io_request->ChainOffset != 0xF) 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()
3368 "correct : %x\n", cmd->io_request->ChainOffset); in megasas_build_and_issue_cmd_fusion()
3379 if (cmd->r1_alt_dev_handle != MR_DEVHANDLE_INVALID) { in megasas_build_and_issue_cmd_fusion()
3381 (scmd->request->tag + instance->max_fw_cmds)); in megasas_build_and_issue_cmd_fusion()
3393 megasas_fire_cmd_fusion(instance, r1_cmd->request_desc); in megasas_build_and_issue_cmd_fusion()
3400 * megasas_complete_r1_command -
3418 rctx_g35 = &cmd->io_request->RaidContext.raid_context_g35; in megasas_complete_r1_command()
3419 fusion = instance->ctrl_context; in megasas_complete_r1_command()
3420 peer_smid = le16_to_cpu(rctx_g35->flow_specific.peer_smid); in megasas_complete_r1_command()
3422 r1_cmd = fusion->cmd_list[peer_smid - 1]; in megasas_complete_r1_command()
3423 scmd_local = cmd->scmd; in megasas_complete_r1_command()
3424 status = rctx_g35->status; in megasas_complete_r1_command()
3425 ex_status = rctx_g35->ex_status; in megasas_complete_r1_command()
3426 data_length = cmd->io_request->DataLength; in megasas_complete_r1_command()
3427 sense = cmd->sense; in megasas_complete_r1_command()
3429 cmd->cmd_completed = true; in megasas_complete_r1_command()
3432 if (r1_cmd->cmd_completed) { in megasas_complete_r1_command()
3433 rctx_g35 = &r1_cmd->io_request->RaidContext.raid_context_g35; in megasas_complete_r1_command()
3434 if (rctx_g35->status != MFI_STAT_OK) { in megasas_complete_r1_command()
3435 status = rctx_g35->status; in megasas_complete_r1_command()
3436 ex_status = rctx_g35->ex_status; in megasas_complete_r1_command()
3437 data_length = r1_cmd->io_request->DataLength; in megasas_complete_r1_command()
3438 sense = r1_cmd->sense; 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()
3447 scmd_local->SCp.ptr = NULL; in megasas_complete_r1_command()
3450 scmd_local->scsi_done(scmd_local); in megasas_complete_r1_command()
3455 * complete_cmd_fusion - Completes command
3482 fusion = instance->ctrl_context; in complete_cmd_fusion()
3484 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in complete_cmd_fusion()
3487 desc = fusion->reply_frames_desc[MSIxIndex] + in complete_cmd_fusion()
3488 fusion->last_reply_idx[MSIxIndex]; in complete_cmd_fusion()
3492 d_val.word = desc->Words; in complete_cmd_fusion()
3494 reply_descript_type = reply_desc->ReplyFlags & in complete_cmd_fusion()
3505 smid = le16_to_cpu(reply_desc->SMID); in complete_cmd_fusion()
3506 cmd_fusion = fusion->cmd_list[smid - 1]; in complete_cmd_fusion()
3508 cmd_fusion->io_request; in complete_cmd_fusion()
3510 scmd_local = cmd_fusion->scmd; in complete_cmd_fusion()
3511 status = scsi_io_req->RaidContext.raid_context.status; in complete_cmd_fusion()
3512 extStatus = scsi_io_req->RaidContext.raid_context.ex_status; in complete_cmd_fusion()
3513 sense = cmd_fusion->sense; in complete_cmd_fusion()
3514 data_length = scsi_io_req->DataLength; in complete_cmd_fusion()
3516 switch (scsi_io_req->Function) { in complete_cmd_fusion()
3519 cmd_fusion->io_request; in complete_cmd_fusion()
3521 &mr_tm_req->TmRequest; in complete_cmd_fusion()
3522 dev_dbg(&instance->pdev->dev, "TM completion:" in complete_cmd_fusion()
3524 mpi_tm_req->TaskType, mpi_tm_req->TaskMID); in complete_cmd_fusion()
3525 complete(&cmd_fusion->done); in complete_cmd_fusion()
3529 if (fusion->load_balance_info && in complete_cmd_fusion()
3530 (cmd_fusion->scmd->SCp.Status & in complete_cmd_fusion()
3533 lbinfo = &fusion->load_balance_info[device_id]; in complete_cmd_fusion()
3534 atomic_dec(&lbinfo->scsi_pending_cmds[cmd_fusion->pd_r1_lb]); in complete_cmd_fusion()
3535 cmd_fusion->scmd->SCp.Status &= ~MEGASAS_LOAD_BALANCE_FLAG; in complete_cmd_fusion()
3538 case MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST: /* LD-IO Path */ in complete_cmd_fusion()
3539 atomic_dec(&instance->fw_outstanding); in complete_cmd_fusion()
3540 if (cmd_fusion->r1_alt_dev_handle == MR_DEVHANDLE_INVALID) { in complete_cmd_fusion()
3544 if (instance->ldio_threshold && in complete_cmd_fusion()
3546 atomic_dec(&instance->ldio_outstanding); in complete_cmd_fusion()
3547 scmd_local->SCp.ptr = NULL; in complete_cmd_fusion()
3550 scmd_local->scsi_done(scmd_local); in complete_cmd_fusion()
3551 } else /* Optimal VD - R1 FP command completion. */ in complete_cmd_fusion()
3555 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in complete_cmd_fusion()
3559 if (cmd_mfi->flags & DRV_DCMD_POLLED_MODE) { in complete_cmd_fusion()
3560 cmd_mfi->flags &= ~DRV_DCMD_POLLED_MODE; in complete_cmd_fusion()
3567 fusion->last_reply_idx[MSIxIndex]++; in complete_cmd_fusion()
3568 if (fusion->last_reply_idx[MSIxIndex] >= in complete_cmd_fusion()
3569 fusion->reply_q_depth) in complete_cmd_fusion()
3570 fusion->last_reply_idx[MSIxIndex] = 0; in complete_cmd_fusion()
3572 desc->Words = cpu_to_le64(ULLONG_MAX); in complete_cmd_fusion()
3577 if (!fusion->last_reply_idx[MSIxIndex]) in complete_cmd_fusion()
3578 desc = fusion->reply_frames_desc[MSIxIndex]; in complete_cmd_fusion()
3585 d_val.word = desc->Words; in complete_cmd_fusion()
3587 reply_descript_type = reply_desc->ReplyFlags & 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()
3600 fusion->last_reply_idx[MSIxIndex], in complete_cmd_fusion()
3601 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3604 fusion->last_reply_idx[MSIxIndex], in complete_cmd_fusion()
3605 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3608 if (!irq_context->irq_poll_scheduled) { in complete_cmd_fusion()
3609 irq_context->irq_poll_scheduled = true; in complete_cmd_fusion()
3610 irq_context->irq_line_enable = true; in complete_cmd_fusion()
3611 irq_poll_sched(&irq_context->irqpoll); in complete_cmd_fusion()
3620 if (instance->msix_combined) in complete_cmd_fusion()
3622 fusion->last_reply_idx[MSIxIndex], in complete_cmd_fusion()
3623 instance->reply_post_host_index_addr[MSIxIndex/8]); in complete_cmd_fusion()
3626 fusion->last_reply_idx[MSIxIndex], in complete_cmd_fusion()
3627 instance->reply_post_host_index_addr[0]); in complete_cmd_fusion()
3634 * megasas_enable_irq_poll() - enable irqpoll
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()
3646 irq_poll_enable(&irq_ctx->irqpoll); in megasas_enable_irq_poll()
3651 * megasas_sync_irqs - Synchronizes all IRQs owned by adapter
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()
3666 irq_poll_disable(&irq_ctx->irqpoll); in megasas_sync_irqs()
3667 if (irq_ctx->irq_poll_scheduled) { in megasas_sync_irqs()
3668 irq_ctx->irq_poll_scheduled = false; in megasas_sync_irqs()
3669 enable_irq(irq_ctx->os_irq); in megasas_sync_irqs()
3675 * megasas_irqpoll() - process a queue for completed reply descriptors
3689 instance = irq_ctx->instance; in megasas_irqpoll()
3691 if (irq_ctx->irq_line_enable) { in megasas_irqpoll()
3692 disable_irq_nosync(irq_ctx->os_irq); in megasas_irqpoll()
3693 irq_ctx->irq_line_enable = false; in megasas_irqpoll()
3696 num_entries = complete_cmd_fusion(instance, irq_ctx->MSIxIndex, irq_ctx); in megasas_irqpoll()
3699 irq_ctx->irq_poll_scheduled = false; in megasas_irqpoll()
3700 enable_irq(irq_ctx->os_irq); in megasas_irqpoll()
3707 * megasas_complete_cmd_dpc_fusion - Completes command
3719 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_complete_cmd_dpc_fusion()
3722 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) in megasas_complete_cmd_dpc_fusion()
3730 * megasas_isr_fusion - isr entry point
3737 struct megasas_instance *instance = irq_context->instance; in megasas_isr_fusion()
3740 if (instance->mask_interrupts) in megasas_isr_fusion()
3743 if (irq_context->irq_poll_scheduled) in megasas_isr_fusion()
3746 if (!instance->msix_vectors) { in megasas_isr_fusion()
3747 mfiStatus = instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3753 if (test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) { in megasas_isr_fusion()
3754 instance->instancet->clear_intr(instance); in megasas_isr_fusion()
3758 return complete_cmd_fusion(instance, irq_context->MSIxIndex, irq_context) in megasas_isr_fusion()
3763 * build_mpt_mfi_pass_thru - builds a cmd fo MFI Pass thru
3776 struct megasas_header *frame_hdr = &mfi_cmd->frame->hdr; in build_mpt_mfi_pass_thru()
3778 fusion = instance->ctrl_context; in build_mpt_mfi_pass_thru()
3781 instance->max_scsi_cmds + mfi_cmd->index); in build_mpt_mfi_pass_thru()
3784 mfi_cmd->context.smid = cmd->index; in build_mpt_mfi_pass_thru()
3792 if (frame_hdr->flags & cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE)) in build_mpt_mfi_pass_thru()
3793 mfi_cmd->flags |= DRV_DCMD_POLLED_MODE; in build_mpt_mfi_pass_thru()
3795 io_req = cmd->io_request; in build_mpt_mfi_pass_thru()
3797 if (instance->adapter_type >= INVADER_SERIES) { in build_mpt_mfi_pass_thru()
3799 (struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL; in build_mpt_mfi_pass_thru()
3800 sgl_ptr_end += fusion->max_sge_in_main_msg - 1; in build_mpt_mfi_pass_thru()
3801 sgl_ptr_end->Flags = 0; in build_mpt_mfi_pass_thru()
3805 (struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL.IeeeChain; in build_mpt_mfi_pass_thru()
3807 io_req->Function = MEGASAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST; in build_mpt_mfi_pass_thru()
3808 io_req->SGLOffset0 = offsetof(struct MPI2_RAID_SCSI_IO_REQUEST, in build_mpt_mfi_pass_thru()
3810 io_req->ChainOffset = fusion->chain_offset_mfi_pthru; in build_mpt_mfi_pass_thru()
3812 mpi25_ieee_chain->Address = cpu_to_le64(mfi_cmd->frame_phys_addr); in build_mpt_mfi_pass_thru()
3814 mpi25_ieee_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT | in build_mpt_mfi_pass_thru()
3817 mpi25_ieee_chain->Length = cpu_to_le32(instance->mfi_frame_size); in build_mpt_mfi_pass_thru()
3821 * build_mpt_cmd - Calls helper function to build a cmd MFI Pass thru cmd
3833 index = cmd->context.smid; in build_mpt_cmd()
3835 req_desc = megasas_get_request_descriptor(instance, index - 1); in build_mpt_cmd()
3837 req_desc->Words = 0; in build_mpt_cmd()
3838 req_desc->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO << in build_mpt_cmd()
3841 req_desc->SCSIIO.SMID = cpu_to_le16(index); in build_mpt_cmd()
3847 * megasas_issue_dcmd_fusion - Issues a MFI Pass thru cmd
3865 * megasas_release_fusion - Reverses the FW initialization
3875 iounmap(instance->reg_set); in megasas_release_fusion()
3877 pci_release_selected_regions(instance->pdev, 1<<instance->bar); in megasas_release_fusion()
3881 * megasas_read_fw_status_reg_fusion - returns the current FW status value
3887 return megasas_readl(instance, &instance->reg_set->outbound_scratch_pad_0); in megasas_read_fw_status_reg_fusion()
3891 * megasas_alloc_host_crash_buffer - Host buffers for Crash dump collection from Firmware
3901 instance->crash_buf[i] = vzalloc(CRASH_DMA_BUF_SIZE); in megasas_alloc_host_crash_buffer()
3902 if (!instance->crash_buf[i]) { in megasas_alloc_host_crash_buffer()
3903 dev_info(&instance->pdev->dev, "Firmware crash dump " in megasas_alloc_host_crash_buffer()
3908 instance->drv_buf_alloc = i; in megasas_alloc_host_crash_buffer()
3912 * megasas_free_host_crash_buffer - Host buffers for Crash dump collection from Firmware
3919 for (i = 0; i < instance->drv_buf_alloc; i++) { in megasas_free_host_crash_buffer()
3920 if (instance->crash_buf[i]) in megasas_free_host_crash_buffer()
3921 vfree(instance->crash_buf[i]); in megasas_free_host_crash_buffer()
3923 instance->drv_buf_index = 0; in megasas_free_host_crash_buffer()
3924 instance->drv_buf_alloc = 0; in megasas_free_host_crash_buffer()
3925 instance->fw_crash_state = UNAVAILABLE; in megasas_free_host_crash_buffer()
3926 instance->fw_crash_buffer_size = 0; in megasas_free_host_crash_buffer()
3930 * megasas_adp_reset_fusion - For controller reset
3941 writel(MPI2_WRSEQ_FLUSH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3942 writel(MPI2_WRSEQ_1ST_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3943 writel(MPI2_WRSEQ_2ND_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3944 writel(MPI2_WRSEQ_3RD_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3945 writel(MPI2_WRSEQ_4TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3946 writel(MPI2_WRSEQ_5TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3947 writel(MPI2_WRSEQ_6TH_KEY_VALUE, &instance->reg_set->fusion_seq_offset); in megasas_adp_reset_fusion()
3950 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3955 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3957 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
3964 return -1; in megasas_adp_reset_fusion()
3968 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3972 host_diag = megasas_readl(instance, &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3977 &instance->reg_set->fusion_host_diag); in megasas_adp_reset_fusion()
3979 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
3986 return -1; in megasas_adp_reset_fusion()
3988 abs_state = instance->instancet->read_fw_status_reg(instance) in megasas_adp_reset_fusion()
3994 abs_state = instance->instancet-> in megasas_adp_reset_fusion()
3998 dev_warn(&instance->pdev->dev, in megasas_adp_reset_fusion()
4001 return -1; in megasas_adp_reset_fusion()
4008 * megasas_check_reset_fusion - For controller reset check
4020 * megasas_trigger_snap_dump - Trigger snap dump in FW
4028 if (!instance->disableOnlineCtrlReset) { in megasas_trigger_snap_dump()
4029 dev_info(&instance->pdev->dev, "Trigger snap dump\n"); in megasas_trigger_snap_dump()
4031 &instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4032 readl(&instance->reg_set->doorbell); in megasas_trigger_snap_dump()
4035 for (j = 0; j < instance->snapdump_wait_time; j++) { in megasas_trigger_snap_dump()
4036 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_trigger_snap_dump()
4039 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_trigger_snap_dump()
4060 (resetwaittime - instance->snapdump_wait_time)); in megasas_wait_for_outstanding_fusion()
4063 dev_info(&instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4066 if (instance->snapdump_wait_time) in megasas_wait_for_outstanding_fusion()
4074 abs_state = instance->instancet->read_fw_status_reg(instance); in megasas_wait_for_outstanding_fusion()
4077 dev_printk(KERN_ERR, &instance->pdev->dev, in megasas_wait_for_outstanding_fusion()
4082 if (instance->requestorId && reason) { in megasas_wait_for_outstanding_fusion()
4083 dev_warn(&instance->pdev->dev, "SR-IOV Found FW in FAULT" in megasas_wait_for_outstanding_fusion()
4086 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4095 /* If SR-IOV VF mode & heartbeat timeout, don't wait */ in megasas_wait_for_outstanding_fusion()
4096 if (instance->requestorId && !reason) { in megasas_wait_for_outstanding_fusion()
4101 /* If SR-IOV VF mode & I/O timeout, check for HB timeout */ in megasas_wait_for_outstanding_fusion()
4102 if (instance->requestorId && (reason == SCSIIO_TIMEOUT_OCR)) { in megasas_wait_for_outstanding_fusion()
4103 if (instance->hb_host_mem->HB.fwCounter != in megasas_wait_for_outstanding_fusion()
4104 instance->hb_host_mem->HB.driverCounter) { in megasas_wait_for_outstanding_fusion()
4105 instance->hb_host_mem->HB.driverCounter = in megasas_wait_for_outstanding_fusion()
4106 instance->hb_host_mem->HB.fwCounter; in megasas_wait_for_outstanding_fusion()
4112 dev_warn(&instance->pdev->dev, "SR-IOV:" in megasas_wait_for_outstanding_fusion()
4117 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4126 outstanding = atomic_read(&instance->fw_outstanding); in megasas_wait_for_outstanding_fusion()
4131 dev_notice(&instance->pdev->dev, "[%2d]waiting for %d " in megasas_wait_for_outstanding_fusion()
4133 outstanding, instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4138 if (instance->snapdump_wait_time) { in megasas_wait_for_outstanding_fusion()
4144 if (atomic_read(&instance->fw_outstanding)) { in megasas_wait_for_outstanding_fusion()
4145 dev_err(&instance->pdev->dev, "pending commands remain after waiting, " in megasas_wait_for_outstanding_fusion()
4147 instance->host->host_no); in megasas_wait_for_outstanding_fusion()
4162 fusion = instance->ctrl_context; in megasas_reset_reply_desc()
4163 count = instance->msix_vectors > 0 ? instance->msix_vectors : 1; in megasas_reset_reply_desc()
4165 fusion->last_reply_idx[i] = 0; in megasas_reset_reply_desc()
4166 reply_desc = fusion->reply_frames_desc[i]; in megasas_reset_reply_desc()
4167 for (j = 0 ; j < fusion->reply_q_depth; j++, reply_desc++) in megasas_reset_reply_desc()
4168 reply_desc->Words = cpu_to_le64(ULLONG_MAX); in megasas_reset_reply_desc()
4173 * megasas_refire_mgmt_cmd : Re-fire management commands
4190 fusion = instance->ctrl_context; in megasas_refire_mgmt_cmd()
4192 /* Re-fire management commands. in megasas_refire_mgmt_cmd()
4195 for (j = instance->max_scsi_cmds ; j < instance->max_fw_cmds; j++) { in megasas_refire_mgmt_cmd()
4196 cmd_fusion = fusion->cmd_list[j]; in megasas_refire_mgmt_cmd()
4197 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in megasas_refire_mgmt_cmd()
4198 smid = le16_to_cpu(cmd_mfi->context.smid); in megasas_refire_mgmt_cmd()
4204 req_desc = megasas_get_request_descriptor(instance, smid - 1); in megasas_refire_mgmt_cmd()
4206 switch (cmd_mfi->frame->hdr.cmd) { in megasas_refire_mgmt_cmd()
4208 opcode = le32_to_cpu(cmd_mfi->frame->dcmd.opcode); in megasas_refire_mgmt_cmd()
4211 cmd_mfi->frame->dcmd.cmd_status = MFI_STAT_OK; in megasas_refire_mgmt_cmd()
4218 !(cmd_mfi->flags & DRV_DCMD_SKIP_REFIRE); in megasas_refire_mgmt_cmd()
4225 if (!instance->support_nvme_passthru) { in megasas_refire_mgmt_cmd()
4226 cmd_mfi->frame->hdr.cmd_status = MFI_STAT_INVALID_CMD; in megasas_refire_mgmt_cmd()
4232 if (!instance->support_pci_lane_margining) { in megasas_refire_mgmt_cmd()
4233 cmd_mfi->frame->hdr.cmd_status = MFI_STAT_INVALID_CMD; in megasas_refire_mgmt_cmd()
4242 if (return_ioctl && cmd_mfi->sync_cmd && in megasas_refire_mgmt_cmd()
4243 cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT) { in megasas_refire_mgmt_cmd()
4244 dev_err(&instance->pdev->dev, in megasas_refire_mgmt_cmd()
4245 "return -EBUSY from %s %d cmd 0x%x opcode 0x%x\n", in megasas_refire_mgmt_cmd()
4246 __func__, __LINE__, cmd_mfi->frame->hdr.cmd, in megasas_refire_mgmt_cmd()
4247 le32_to_cpu(cmd_mfi->frame->dcmd.opcode)); in megasas_refire_mgmt_cmd()
4248 cmd_mfi->cmd_status_drv = DCMD_BUSY; in megasas_refire_mgmt_cmd()
4253 cmd_fusion->io_request; in megasas_refire_mgmt_cmd()
4254 if (scsi_io_req->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) in megasas_refire_mgmt_cmd()
4284 fusion = instance->ctrl_context; in megasas_return_polled_cmds()
4286 for (i = instance->max_scsi_cmds; i < instance->max_fw_cmds; i++) { in megasas_return_polled_cmds()
4287 cmd_fusion = fusion->cmd_list[i]; in megasas_return_polled_cmds()
4288 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx]; in megasas_return_polled_cmds()
4290 if (cmd_mfi->flags & DRV_DCMD_POLLED_MODE) { in megasas_return_polled_cmds()
4292 dev_info(&instance->pdev->dev, in megasas_return_polled_cmds()
4294 __func__, __LINE__, cmd_mfi->frame->hdr.cmd, in megasas_return_polled_cmds()
4295 le32_to_cpu(cmd_mfi->frame->dcmd.opcode)); in megasas_return_polled_cmds()
4296 cmd_mfi->flags &= ~DRV_DCMD_POLLED_MODE; in megasas_return_polled_cmds()
4305 * @channel: the channel assigned by the OS
4306 * @id: the id assigned by the OS
4317 fusion = instance->ctrl_context; in megasas_track_scsiio()
4319 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_track_scsiio()
4320 cmd_fusion = fusion->cmd_list[i]; in megasas_track_scsiio()
4321 if (cmd_fusion->scmd && in megasas_track_scsiio()
4322 (cmd_fusion->scmd->device->id == id && in megasas_track_scsiio()
4323 cmd_fusion->scmd->device->channel == channel)) { in megasas_track_scsiio()
4324 dev_info(&instance->pdev->dev, in megasas_track_scsiio()
4327 channel, id, cmd_fusion->index); in megasas_track_scsiio()
4328 scsi_print_command(cmd_fusion->scmd); in megasas_track_scsiio()
4338 * megasas_tm_response_code - translation of device response code
4350 switch (mpi_reply->ResponseCode) { in megasas_tm_response_code()
4379 dev_dbg(&instance->pdev->dev, "response_code(%01x): %s\n", in megasas_tm_response_code()
4380 mpi_reply->ResponseCode, desc); in megasas_tm_response_code()
4381 dev_dbg(&instance->pdev->dev, in megasas_tm_response_code()
4384 mpi_reply->TerminationCount, mpi_reply->DevHandle, in megasas_tm_response_code()
4385 mpi_reply->Function, mpi_reply->TaskType, in megasas_tm_response_code()
4386 mpi_reply->IOCStatus, mpi_reply->IOCLogInfo); in megasas_tm_response_code()
4390 * megasas_issue_tm - main routine for sending tm requests
4393 * @channel: the channel assigned by the OS
4394 * @id: the id assigned by the OS
4422 fusion = instance->ctrl_context; in megasas_issue_tm()
4427 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_issue_tm()
4429 return -ENOMEM; in megasas_issue_tm()
4433 instance->max_scsi_cmds + cmd_mfi->index); in megasas_issue_tm()
4436 cmd_mfi->context.smid = cmd_fusion->index; in megasas_issue_tm()
4439 (cmd_fusion->index - 1)); in megasas_issue_tm()
4441 cmd_fusion->request_desc = req_desc; in megasas_issue_tm()
4442 req_desc->Words = 0; in megasas_issue_tm()
4444 mr_request = (struct MR_TASK_MANAGE_REQUEST *) cmd_fusion->io_request; in megasas_issue_tm()
4446 mpi_request = (struct MPI2_SCSI_TASK_MANAGE_REQUEST *) &mr_request->TmRequest; in megasas_issue_tm()
4447 mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; in megasas_issue_tm()
4448 mpi_request->DevHandle = cpu_to_le16(device_handle); in megasas_issue_tm()
4449 mpi_request->TaskType = type; in megasas_issue_tm()
4450 mpi_request->TaskMID = cpu_to_le16(smid_task); in megasas_issue_tm()
4451 mpi_request->LUN[1] = 0; in megasas_issue_tm()
4454 req_desc = cmd_fusion->request_desc; in megasas_issue_tm()
4455 req_desc->HighPriority.SMID = cpu_to_le16(cmd_fusion->index); in megasas_issue_tm()
4456 req_desc->HighPriority.RequestFlags = in megasas_issue_tm()
4459 req_desc->HighPriority.MSIxIndex = 0; in megasas_issue_tm()
4460 req_desc->HighPriority.LMID = 0; in megasas_issue_tm()
4461 req_desc->HighPriority.Reserved1 = 0; in megasas_issue_tm()
4464 mr_request->tmReqFlags.isTMForPD = 1; in megasas_issue_tm()
4466 mr_request->tmReqFlags.isTMForLD = 1; in megasas_issue_tm()
4468 init_completion(&cmd_fusion->done); in megasas_issue_tm()
4473 timeout = mr_device_priv_data->task_abort_tmo; in megasas_issue_tm()
4476 timeout = mr_device_priv_data->target_reset_tmo; in megasas_issue_tm()
4480 timeleft = wait_for_completion_timeout(&cmd_fusion->done, timeout * HZ); in megasas_issue_tm()
4483 dev_err(&instance->pdev->dev, in megasas_issue_tm()
4485 mutex_unlock(&instance->reset_mutex); in megasas_issue_tm()
4486 rc = megasas_reset_fusion(instance->host, MFI_IO_TIMEOUT_OCR); in megasas_issue_tm()
4487 mutex_lock(&instance->reset_mutex); in megasas_issue_tm()
4491 mpi_reply = (struct MPI2_SCSI_TASK_MANAGE_REPLY *) &mr_request->TMReply; in megasas_issue_tm()
4498 scsi_lookup = fusion->cmd_list[smid_task - 1]; in megasas_issue_tm()
4500 if (scsi_lookup->scmd == NULL) in megasas_issue_tm()
4503 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4505 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4507 if (scsi_lookup->scmd == NULL) in megasas_issue_tm()
4516 instance->instancet->disable_intr(instance); in megasas_issue_tm()
4519 instance->instancet->enable_intr(instance); in megasas_issue_tm()
4548 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_fusion_smid_lookup()
4550 fusion = instance->ctrl_context; in megasas_fusion_smid_lookup()
4552 for (i = 0; i < instance->max_scsi_cmds; i++) { in megasas_fusion_smid_lookup()
4553 cmd_fusion = fusion->cmd_list[i]; in megasas_fusion_smid_lookup()
4554 if (cmd_fusion->scmd && (cmd_fusion->scmd == scmd)) { in megasas_fusion_smid_lookup()
4556 " SMID: %d\n", cmd_fusion->index); in megasas_fusion_smid_lookup()
4557 ret = cmd_fusion->index; in megasas_fusion_smid_lookup()
4566 * megasas_get_tm_devhandle - Get devhandle for TM request
4567 * @sdev- OS provided scsi device
4569 * Returns- devhandle/targetID of SCSI device
4580 instance = (struct megasas_instance *)sdev->host->hostdata; in megasas_get_tm_devhandle()
4581 fusion = instance->ctrl_context; in megasas_get_tm_devhandle()
4584 if (instance->use_seqnum_jbod_fp) { in megasas_get_tm_devhandle()
4585 pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) in megasas_get_tm_devhandle()
4586 + sdev->id; in megasas_get_tm_devhandle()
4587 pd_sync = (void *)fusion->pd_seq_sync in megasas_get_tm_devhandle()
4588 [(instance->pd_seq_map_id - 1) & 1]; in megasas_get_tm_devhandle()
4589 devhandle = pd_sync->seq[pd_index].devHandle; in megasas_get_tm_devhandle()
4594 device_id = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) in megasas_get_tm_devhandle()
4595 + sdev->id; in megasas_get_tm_devhandle()
4615 mr_device_priv_data = scmd->device->hostdata; in megasas_task_abort_fusion()
4617 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_task_abort_fusion()
4619 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_task_abort_fusion()
4620 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_task_abort_fusion()
4621 "SCSI host:%d\n", instance->host->host_no); in megasas_task_abort_fusion()
4627 sdev_printk(KERN_INFO, scmd->device, "device been deleted! " in megasas_task_abort_fusion()
4629 scmd->result = DID_NO_CONNECT << 16; in megasas_task_abort_fusion()
4634 if (!mr_device_priv_data->is_tm_capable) { in megasas_task_abort_fusion()
4639 mutex_lock(&instance->reset_mutex); in megasas_task_abort_fusion()
4647 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4651 devhandle = megasas_get_tm_devhandle(scmd->device); in megasas_task_abort_fusion()
4655 sdev_printk(KERN_INFO, scmd->device, in megasas_task_abort_fusion()
4657 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4660 sdev_printk(KERN_INFO, scmd->device, in megasas_task_abort_fusion()
4664 mr_device_priv_data->tm_busy = true; in megasas_task_abort_fusion()
4666 scmd->device->channel, scmd->device->id, smid, in megasas_task_abort_fusion()
4669 mr_device_priv_data->tm_busy = false; in megasas_task_abort_fusion()
4671 mutex_unlock(&instance->reset_mutex); in megasas_task_abort_fusion()
4696 mr_device_priv_data = scmd->device->hostdata; in megasas_reset_target_fusion()
4698 instance = (struct megasas_instance *)scmd->device->host->hostdata; in megasas_reset_target_fusion()
4700 if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { in megasas_reset_target_fusion()
4701 dev_err(&instance->pdev->dev, "Controller is not OPERATIONAL," in megasas_reset_target_fusion()
4702 "SCSI host:%d\n", instance->host->host_no); in megasas_reset_target_fusion()
4708 sdev_printk(KERN_INFO, scmd->device, in megasas_reset_target_fusion()
4710 scmd->result = DID_NO_CONNECT << 16; in megasas_reset_target_fusion()
4715 if (!mr_device_priv_data->is_tm_capable) { in megasas_reset_target_fusion()
4720 mutex_lock(&instance->reset_mutex); in megasas_reset_target_fusion()
4721 devhandle = megasas_get_tm_devhandle(scmd->device); in megasas_reset_target_fusion()
4725 sdev_printk(KERN_INFO, scmd->device, in megasas_reset_target_fusion()
4727 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4731 sdev_printk(KERN_INFO, scmd->device, in megasas_reset_target_fusion()
4734 mr_device_priv_data->tm_busy = true; in megasas_reset_target_fusion()
4736 scmd->device->channel, scmd->device->id, 0, in megasas_reset_target_fusion()
4739 mr_device_priv_data->tm_busy = false; in megasas_reset_target_fusion()
4740 mutex_unlock(&instance->reset_mutex); in megasas_reset_target_fusion()
4757 megasas_mgmt_info.instance[i]->requestorId && in megasas_get_peer_instance()
4758 megasas_mgmt_info.instance[i]->peerIsPresent && in megasas_get_peer_instance()
4759 (memcmp((megasas_mgmt_info.instance[i]->clusterId), in megasas_get_peer_instance()
4760 instance->clusterId, MEGASAS_CLUSTER_ID_SIZE) == 0)) in megasas_get_peer_instance()
4773 if (instance->peerIsPresent) { in megasas_check_mpio_paths()
4776 (atomic_read(&peer_instance->adprecovery) == in megasas_check_mpio_paths()
4799 instance = (struct megasas_instance *)shost->hostdata; in megasas_reset_fusion()
4800 fusion = instance->ctrl_context; in megasas_reset_fusion()
4802 mutex_lock(&instance->reset_mutex); in megasas_reset_fusion()
4804 if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { in megasas_reset_fusion()
4805 dev_warn(&instance->pdev->dev, "Hardware critical error, " in megasas_reset_fusion()
4807 instance->host->host_no); in megasas_reset_fusion()
4808 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4811 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4815 if (abs_state != MFI_STATE_FAULT && instance->crash_dump_buf && in megasas_reset_fusion()
4816 instance->crash_dump_app_support && reason) { in megasas_reset_fusion()
4817 dev_info(&instance->pdev->dev, "IO/DCMD timeout is detected, " in megasas_reset_fusion()
4819 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4820 status_reg = megasas_readl(instance, &instance->reg_set->doorbell); in megasas_reset_fusion()
4822 &instance->reg_set->doorbell); in megasas_reset_fusion()
4823 readl(&instance->reg_set->doorbell); in megasas_reset_fusion()
4824 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
4828 dev_dbg(&instance->pdev->dev, "waiting for [%d] " in megasas_reset_fusion()
4831 } while ((atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) && in megasas_reset_fusion()
4834 if (atomic_read(&instance->adprecovery) == MEGASAS_HBA_OPERATIONAL) { in megasas_reset_fusion()
4835 dev_info(&instance->pdev->dev, "OCR done for IO " in megasas_reset_fusion()
4839 dev_info(&instance->pdev->dev, "Controller is not " in megasas_reset_fusion()
4848 if (instance->requestorId && !instance->skip_heartbeat_timer_del) in megasas_reset_fusion()
4849 del_timer_sync(&instance->sriov_heartbeat_timer); in megasas_reset_fusion()
4850 set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
4851 set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); in megasas_reset_fusion()
4852 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); in megasas_reset_fusion()
4853 instance->instancet->disable_intr(instance); in megasas_reset_fusion()
4859 atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT); in megasas_reset_fusion()
4860 dev_warn(&instance->pdev->dev, "resetting fusion " in megasas_reset_fusion()
4861 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4866 dev_info(&instance->pdev->dev, "\nPending SCSI commands:\n"); in megasas_reset_fusion()
4868 /* Now return commands back to the OS */ in megasas_reset_fusion()
4869 for (i = 0 ; i < instance->max_scsi_cmds; i++) { in megasas_reset_fusion()
4870 cmd_fusion = fusion->cmd_list[i]; in megasas_reset_fusion()
4872 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4873 r1_cmd = fusion->cmd_list[i + instance->max_fw_cmds]; in megasas_reset_fusion()
4876 scmd_local = cmd_fusion->scmd; in megasas_reset_fusion()
4877 if (cmd_fusion->scmd) { in megasas_reset_fusion()
4880 cmd_fusion->scmd->device, "SMID: 0x%x\n", in megasas_reset_fusion()
4881 cmd_fusion->index); in megasas_reset_fusion()
4882 megasas_dump_fusion_io(cmd_fusion->scmd); in megasas_reset_fusion()
4885 if (cmd_fusion->io_request->Function == in megasas_reset_fusion()
4889 scmd_local->result = in megasas_reset_fusion()
4892 if (instance->ldio_threshold && in megasas_reset_fusion()
4894 atomic_dec(&instance->ldio_outstanding); in megasas_reset_fusion()
4897 scmd_local->scsi_done(scmd_local); in megasas_reset_fusion()
4901 dev_info(&instance->pdev->dev, "Outstanding fastpath IOs: %d\n", in megasas_reset_fusion()
4904 atomic_set(&instance->fw_outstanding, 0); in megasas_reset_fusion()
4906 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_reset_fusion()
4909 if (instance->disableOnlineCtrlReset || in megasas_reset_fusion()
4912 dev_warn(&instance->pdev->dev, "Reset not supported" in megasas_reset_fusion()
4914 instance->host->host_no); in megasas_reset_fusion()
4918 /* Let SR-IOV VF & PF sync up if there was a HB failure */ in megasas_reset_fusion()
4919 if (instance->requestorId && !reason) { in megasas_reset_fusion()
4937 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
4939 "scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
4950 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
4957 (i == (MEGASAS_FUSION_MAX_RESET_TRIES - 1) in megasas_reset_fusion()
4961 if (fusion->load_balance_info) in megasas_reset_fusion()
4962 memset(fusion->load_balance_info, 0, in megasas_reset_fusion()
4980 if (instance->adapter_type >= VENTURA_SERIES) { in megasas_reset_fusion()
4982 memset(fusion->stream_detect_by_ld[j], in megasas_reset_fusion()
4984 fusion->stream_detect_by_ld[j]->mru_bit_map in megasas_reset_fusion()
4990 &instance->reset_flags); in megasas_reset_fusion()
4991 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
4994 if ((instance->tgt_prop) && in megasas_reset_fusion()
4995 (instance->nvme_page_size)) in megasas_reset_fusion()
5002 status_reg = instance->instancet->read_fw_status_reg in megasas_reset_fusion()
5006 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5008 abs_state, instance->host->host_no); in megasas_reset_fusion()
5011 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
5013 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5015 instance->host->host_no); in megasas_reset_fusion()
5017 /* Restart SR-IOV heartbeat */ in megasas_reset_fusion()
5018 if (instance->requestorId) { in megasas_reset_fusion()
5022 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5025 if (instance->crash_dump_drv_support && in megasas_reset_fusion()
5026 instance->crash_dump_app_support) in megasas_reset_fusion()
5033 if (instance->snapdump_wait_time) { in megasas_reset_fusion()
5035 dev_info(&instance->pdev->dev, in megasas_reset_fusion()
5037 instance->snapdump_wait_time); in megasas_reset_fusion()
5043 dev_warn(&instance->pdev->dev, in megasas_reset_fusion()
5045 instance->host->host_no); in megasas_reset_fusion()
5050 dev_warn(&instance->pdev->dev, "Reset failed, killing " in megasas_reset_fusion()
5051 "adapter scsi%d.\n", instance->host->host_no); in megasas_reset_fusion()
5055 if (instance->requestorId) { in megasas_reset_fusion()
5058 clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); in megasas_reset_fusion()
5059 instance->instancet->enable_intr(instance); in megasas_reset_fusion()
5061 atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); in megasas_reset_fusion()
5067 instance->skip_heartbeat_timer_del = 1; in megasas_reset_fusion()
5070 clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); in megasas_reset_fusion()
5071 mutex_unlock(&instance->reset_mutex); in megasas_reset_fusion()
5083 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5089 if (instance->drv_buf_index == 0) { in megasas_fusion_crash_dump()
5093 if (instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5094 dev_info(&instance->pdev->dev, "earlier crash dump is " in megasas_fusion_crash_dump()
5099 &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5100 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5104 dev_info(&instance->pdev->dev, "Number of host crash buffers " in megasas_fusion_crash_dump()
5105 "allocated: %d\n", instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5118 status_reg = instance->instancet->read_fw_status_reg( in megasas_fusion_crash_dump()
5124 if (instance->drv_buf_index >= instance->drv_buf_alloc) { in megasas_fusion_crash_dump()
5125 dev_info(&instance->pdev->dev, in megasas_fusion_crash_dump()
5127 instance->drv_buf_alloc); in megasas_fusion_crash_dump()
5132 memcpy(instance->crash_buf[instance->drv_buf_index], in megasas_fusion_crash_dump()
5133 instance->crash_dump_buf, CRASH_DMA_BUF_SIZE); in megasas_fusion_crash_dump()
5134 instance->drv_buf_index++; in megasas_fusion_crash_dump()
5138 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5139 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5142 status_reg = instance->instancet->read_fw_status_reg(instance); in megasas_fusion_crash_dump()
5146 dev_info(&instance->pdev->dev, "Crash Dump is available,number " in megasas_fusion_crash_dump()
5147 "of copied buffers: %d\n", instance->drv_buf_index); in megasas_fusion_crash_dump()
5148 instance->fw_crash_buffer_size = instance->drv_buf_index; in megasas_fusion_crash_dump()
5149 instance->fw_crash_state = AVAILABLE; in megasas_fusion_crash_dump()
5150 instance->drv_buf_index = 0; in megasas_fusion_crash_dump()
5151 writel(status_reg, &instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5152 readl(&instance->reg_set->outbound_scratch_pad_0); in megasas_fusion_crash_dump()
5154 megasas_reset_fusion(instance->host, 0); in megasas_fusion_crash_dump()
5165 megasas_reset_fusion(instance->host, 0); in megasas_fusion_ocr_wq()
5174 instance->ctrl_context = kzalloc(sizeof(struct fusion_context), in megasas_alloc_fusion_context()
5176 if (!instance->ctrl_context) { in megasas_alloc_fusion_context()
5177 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5179 return -ENOMEM; in megasas_alloc_fusion_context()
5182 fusion = instance->ctrl_context; in megasas_alloc_fusion_context()
5184 fusion->log_to_span_pages = get_order(MAX_LOGICAL_DRIVES_EXT * in megasas_alloc_fusion_context()
5186 fusion->log_to_span = in megasas_alloc_fusion_context()
5188 fusion->log_to_span_pages); in megasas_alloc_fusion_context()
5189 if (!fusion->log_to_span) { in megasas_alloc_fusion_context()
5190 fusion->log_to_span = in megasas_alloc_fusion_context()
5193 if (!fusion->log_to_span) { in megasas_alloc_fusion_context()
5194 dev_err(&instance->pdev->dev, "Failed from %s %d\n", in megasas_alloc_fusion_context()
5196 return -ENOMEM; in megasas_alloc_fusion_context()
5200 fusion->load_balance_info_pages = get_order(MAX_LOGICAL_DRIVES_EXT * in megasas_alloc_fusion_context()
5202 fusion->load_balance_info = in megasas_alloc_fusion_context()
5204 fusion->load_balance_info_pages); in megasas_alloc_fusion_context()
5205 if (!fusion->load_balance_info) { in megasas_alloc_fusion_context()
5206 fusion->load_balance_info = in megasas_alloc_fusion_context()
5209 if (!fusion->load_balance_info) in megasas_alloc_fusion_context()
5210 dev_err(&instance->pdev->dev, "Failed to allocate load_balance_info, " in megasas_alloc_fusion_context()
5220 struct fusion_context *fusion = instance->ctrl_context; in megasas_free_fusion_context()
5223 if (fusion->load_balance_info) { in megasas_free_fusion_context()
5224 if (is_vmalloc_addr(fusion->load_balance_info)) in megasas_free_fusion_context()
5225 vfree(fusion->load_balance_info); in megasas_free_fusion_context()
5227 free_pages((ulong)fusion->load_balance_info, in megasas_free_fusion_context()
5228 fusion->load_balance_info_pages); in megasas_free_fusion_context()
5231 if (fusion->log_to_span) { in megasas_free_fusion_context()
5232 if (is_vmalloc_addr(fusion->log_to_span)) in megasas_free_fusion_context()
5233 vfree(fusion->log_to_span); in megasas_free_fusion_context()
5235 free_pages((ulong)fusion->log_to_span, in megasas_free_fusion_context()
5236 fusion->log_to_span_pages); in megasas_free_fusion_context()