• Home
  • Raw
  • Download

Lines Matching +full:non +full:- +full:operational

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2017-2023 Broadcom Inc.
6 * (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
11 #include <linux/io-64-nonatomic-lo-hi.h>
23 MODULE_PARM_DESC(poll_queues, "Number of queues for io_uring poll mode. (Range 1 - 126)");
46 pi = op_req_q->pi; in mpi3mr_check_req_qfull()
47 ci = READ_ONCE(op_req_q->ci); in mpi3mr_check_req_qfull()
48 max_entries = op_req_q->num_requests; in mpi3mr_check_req_qfull()
50 if ((ci == (pi + 1)) || ((!ci) && (pi == (max_entries - 1)))) in mpi3mr_check_req_qfull()
60 max_vectors = mrioc->intr_info_count; in mpi3mr_sync_irqs()
63 synchronize_irq(pci_irq_vector(mrioc->pdev, i)); in mpi3mr_sync_irqs()
68 mrioc->intr_enabled = 0; in mpi3mr_ioc_disable_intr()
74 mrioc->intr_enabled = 1; in mpi3mr_ioc_enable_intr()
83 if (!mrioc->intr_info) in mpi3mr_cleanup_isr()
86 for (i = 0; i < mrioc->intr_info_count; i++) in mpi3mr_cleanup_isr()
87 free_irq(pci_irq_vector(mrioc->pdev, i), in mpi3mr_cleanup_isr()
88 (mrioc->intr_info + i)); in mpi3mr_cleanup_isr()
90 kfree(mrioc->intr_info); in mpi3mr_cleanup_isr()
91 mrioc->intr_info = NULL; in mpi3mr_cleanup_isr()
92 mrioc->intr_info_count = 0; in mpi3mr_cleanup_isr()
93 mrioc->is_intr_info_set = false; in mpi3mr_cleanup_isr()
94 pci_free_irq_vectors(mrioc->pdev); in mpi3mr_cleanup_isr()
102 sgel->flags = flags; in mpi3mr_add_sg_single()
103 sgel->length = cpu_to_le32(length); in mpi3mr_add_sg_single()
104 sgel->address = cpu_to_le64(dma_addr); in mpi3mr_add_sg_single()
111 mpi3mr_add_sg_single(paddr, sgl_flags, 0, -1); in mpi3mr_build_zero_len_sge()
120 if ((phys_addr < mrioc->reply_buf_dma) || in mpi3mr_get_reply_virt_addr()
121 (phys_addr > mrioc->reply_buf_dma_max_address)) in mpi3mr_get_reply_virt_addr()
124 return mrioc->reply_buf + (phys_addr - mrioc->reply_buf_dma); in mpi3mr_get_reply_virt_addr()
133 return mrioc->sense_buf + (phys_addr - mrioc->sense_buf_dma); in mpi3mr_get_sensebuf_virt_addr()
142 spin_lock_irqsave(&mrioc->reply_free_queue_lock, flags); in mpi3mr_repost_reply_buf()
143 old_idx = mrioc->reply_free_queue_host_index; in mpi3mr_repost_reply_buf()
144 mrioc->reply_free_queue_host_index = ( in mpi3mr_repost_reply_buf()
145 (mrioc->reply_free_queue_host_index == in mpi3mr_repost_reply_buf()
146 (mrioc->reply_free_qsz - 1)) ? 0 : in mpi3mr_repost_reply_buf()
147 (mrioc->reply_free_queue_host_index + 1)); in mpi3mr_repost_reply_buf()
148 mrioc->reply_free_q[old_idx] = cpu_to_le64(reply_dma); in mpi3mr_repost_reply_buf()
149 writel(mrioc->reply_free_queue_host_index, in mpi3mr_repost_reply_buf()
150 &mrioc->sysif_regs->reply_free_host_index); in mpi3mr_repost_reply_buf()
151 spin_unlock_irqrestore(&mrioc->reply_free_queue_lock, flags); in mpi3mr_repost_reply_buf()
160 spin_lock_irqsave(&mrioc->sbq_lock, flags); in mpi3mr_repost_sense_buf()
161 old_idx = mrioc->sbq_host_index; in mpi3mr_repost_sense_buf()
162 mrioc->sbq_host_index = ((mrioc->sbq_host_index == in mpi3mr_repost_sense_buf()
163 (mrioc->sense_buf_q_sz - 1)) ? 0 : in mpi3mr_repost_sense_buf()
164 (mrioc->sbq_host_index + 1)); in mpi3mr_repost_sense_buf()
165 mrioc->sense_buf_q[old_idx] = cpu_to_le64(sense_buf_dma); in mpi3mr_repost_sense_buf()
166 writel(mrioc->sbq_host_index, in mpi3mr_repost_sense_buf()
167 &mrioc->sysif_regs->sense_buffer_free_host_index); in mpi3mr_repost_sense_buf()
168 spin_unlock_irqrestore(&mrioc->sbq_lock, flags); in mpi3mr_repost_sense_buf()
177 if (!(mrioc->logging_level & MPI3_DEBUG_EVENT)) in mpi3mr_print_event_data()
180 event = event_reply->event; in mpi3mr_print_event_data()
201 (struct mpi3_device_page0 *)event_reply->event_data; in mpi3mr_print_event_data()
203 event_data->dev_handle, event_data->device_form); in mpi3mr_print_event_data()
209 (struct mpi3_device_page0 *)event_reply->event_data; in mpi3mr_print_event_data()
211 event_data->dev_handle, event_data->device_form); in mpi3mr_print_event_data()
217 (struct mpi3_event_data_device_status_change *)event_reply->event_data; in mpi3mr_print_event_data()
219 event_data->dev_handle, event_data->reason_code); in mpi3mr_print_event_data()
225 (struct mpi3_event_data_sas_discovery *)event_reply->event_data; in mpi3mr_print_event_data()
227 (event_data->reason_code == MPI3_EVENT_SAS_DISC_RC_STARTED) ? in mpi3mr_print_event_data()
229 le32_to_cpu(event_data->discovery_status)); in mpi3mr_print_event_data()
268 (struct mpi3_event_data_pcie_enumeration *)event_reply->event_data; in mpi3mr_print_event_data()
270 (event_data->reason_code == in mpi3mr_print_event_data()
272 if (event_data->enumeration_status) in mpi3mr_print_event_data()
274 le32_to_cpu(event_data->enumeration_status)); in mpi3mr_print_event_data()
294 mrioc->change_count = le16_to_cpu(event_reply->ioc_change_count); in mpi3mr_handle_events()
307 return &mrioc->init_cmds; in mpi3mr_get_drv_cmd()
309 return &mrioc->cfg_cmds; in mpi3mr_get_drv_cmd()
311 return &mrioc->bsg_cmds; in mpi3mr_get_drv_cmd()
313 return &mrioc->host_tm_cmds; in mpi3mr_get_drv_cmd()
315 return &mrioc->pel_abort_cmd; in mpi3mr_get_drv_cmd()
317 return &mrioc->pel_cmds; in mpi3mr_get_drv_cmd()
319 return &mrioc->transport_cmds; in mpi3mr_get_drv_cmd()
321 if (def_reply && def_reply->function == in mpi3mr_get_drv_cmd()
330 idx = host_tag - MPI3MR_HOSTTAG_DEVRMCMD_MIN; in mpi3mr_get_drv_cmd()
331 return &mrioc->dev_rmhs_cmds[idx]; in mpi3mr_get_drv_cmd()
336 idx = host_tag - MPI3MR_HOSTTAG_EVTACKCMD_MIN; in mpi3mr_get_drv_cmd()
337 return &mrioc->evtack_cmds[idx]; in mpi3mr_get_drv_cmd()
358 reply_desc_type = le16_to_cpu(reply_desc->reply_flags) & in mpi3mr_process_admin_reply_desc()
363 host_tag = le16_to_cpu(status_desc->host_tag); in mpi3mr_process_admin_reply_desc()
364 ioc_status = le16_to_cpu(status_desc->ioc_status); in mpi3mr_process_admin_reply_desc()
367 ioc_loginfo = le32_to_cpu(status_desc->ioc_log_info); in mpi3mr_process_admin_reply_desc()
372 *reply_dma = le64_to_cpu(addr_desc->reply_frame_address); in mpi3mr_process_admin_reply_desc()
376 host_tag = le16_to_cpu(def_reply->host_tag); in mpi3mr_process_admin_reply_desc()
377 ioc_status = le16_to_cpu(def_reply->ioc_status); in mpi3mr_process_admin_reply_desc()
380 ioc_loginfo = le32_to_cpu(def_reply->ioc_log_info); in mpi3mr_process_admin_reply_desc()
382 if (def_reply->function == MPI3_FUNCTION_SCSI_IO) { in mpi3mr_process_admin_reply_desc()
385 le64_to_cpu(scsi_reply->sense_data_buffer_address)); in mpi3mr_process_admin_reply_desc()
390 host_tag = le16_to_cpu(success_desc->host_tag); in mpi3mr_process_admin_reply_desc()
398 if (cmdptr->state & MPI3MR_CMD_PENDING) { in mpi3mr_process_admin_reply_desc()
399 cmdptr->state |= MPI3MR_CMD_COMPLETE; in mpi3mr_process_admin_reply_desc()
400 cmdptr->ioc_loginfo = ioc_loginfo; in mpi3mr_process_admin_reply_desc()
401 cmdptr->ioc_status = ioc_status; in mpi3mr_process_admin_reply_desc()
402 cmdptr->state &= ~MPI3MR_CMD_PENDING; in mpi3mr_process_admin_reply_desc()
404 cmdptr->state |= MPI3MR_CMD_REPLY_VALID; in mpi3mr_process_admin_reply_desc()
405 memcpy((u8 *)cmdptr->reply, (u8 *)def_reply, in mpi3mr_process_admin_reply_desc()
406 mrioc->reply_sz); in mpi3mr_process_admin_reply_desc()
408 if (sense_buf && cmdptr->sensebuf) { in mpi3mr_process_admin_reply_desc()
409 cmdptr->is_sense = 1; in mpi3mr_process_admin_reply_desc()
410 memcpy(cmdptr->sensebuf, sense_buf, in mpi3mr_process_admin_reply_desc()
413 if (cmdptr->is_waiting) { in mpi3mr_process_admin_reply_desc()
414 complete(&cmdptr->done); in mpi3mr_process_admin_reply_desc()
415 cmdptr->is_waiting = 0; in mpi3mr_process_admin_reply_desc()
416 } else if (cmdptr->callback) in mpi3mr_process_admin_reply_desc()
417 cmdptr->callback(mrioc, cmdptr); in mpi3mr_process_admin_reply_desc()
423 le64_to_cpu(scsi_reply->sense_data_buffer_address)); in mpi3mr_process_admin_reply_desc()
428 u32 exp_phase = mrioc->admin_reply_ephase; in mpi3mr_process_admin_reply_q()
429 u32 admin_reply_ci = mrioc->admin_reply_ci; in mpi3mr_process_admin_reply_q()
434 if (!atomic_add_unless(&mrioc->admin_reply_q_in_use, 1, 1)) in mpi3mr_process_admin_reply_q()
437 reply_desc = (struct mpi3_default_reply_descriptor *)mrioc->admin_reply_base + in mpi3mr_process_admin_reply_q()
440 if ((le16_to_cpu(reply_desc->reply_flags) & in mpi3mr_process_admin_reply_q()
442 atomic_dec(&mrioc->admin_reply_q_in_use); in mpi3mr_process_admin_reply_q()
447 if (mrioc->unrecoverable) in mpi3mr_process_admin_reply_q()
450 mrioc->admin_req_ci = le16_to_cpu(reply_desc->request_queue_ci); in mpi3mr_process_admin_reply_q()
455 if (++admin_reply_ci == mrioc->num_admin_replies) { in mpi3mr_process_admin_reply_q()
460 (struct mpi3_default_reply_descriptor *)mrioc->admin_reply_base + in mpi3mr_process_admin_reply_q()
462 if ((le16_to_cpu(reply_desc->reply_flags) & in mpi3mr_process_admin_reply_q()
467 writel(admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci); in mpi3mr_process_admin_reply_q()
468 mrioc->admin_reply_ci = admin_reply_ci; in mpi3mr_process_admin_reply_q()
469 mrioc->admin_reply_ephase = exp_phase; in mpi3mr_process_admin_reply_q()
470 atomic_dec(&mrioc->admin_reply_q_in_use); in mpi3mr_process_admin_reply_q()
476 * mpi3mr_get_reply_desc - get reply descriptor frame corresponding to
477 * queue's consumer index from operational reply descriptor queue.
479 * @reply_ci: operational reply descriptor's queue consumer index
487 struct segments *segments = op_reply_q->q_segments; in mpi3mr_get_reply_desc()
491 segments[reply_ci / op_reply_q->segment_qd].segment; in mpi3mr_get_reply_desc()
493 (reply_ci % op_reply_q->segment_qd); in mpi3mr_get_reply_desc()
498 * mpi3mr_process_op_reply_q - Operational reply queue handler
500 * @op_reply_q: Operational reply queue info
502 * Checks the specific operational reply queue and drains the
520 reply_qidx = op_reply_q->qid - 1; in mpi3mr_process_op_reply_q()
522 if (!atomic_add_unless(&op_reply_q->in_use, 1, 1)) in mpi3mr_process_op_reply_q()
525 exp_phase = op_reply_q->ephase; in mpi3mr_process_op_reply_q()
526 reply_ci = op_reply_q->ci; in mpi3mr_process_op_reply_q()
529 if ((le16_to_cpu(reply_desc->reply_flags) & in mpi3mr_process_op_reply_q()
531 atomic_dec(&op_reply_q->in_use); in mpi3mr_process_op_reply_q()
536 if (mrioc->unrecoverable) in mpi3mr_process_op_reply_q()
539 req_q_idx = le16_to_cpu(reply_desc->request_queue_id) - 1; in mpi3mr_process_op_reply_q()
540 op_req_q = &mrioc->req_qinfo[req_q_idx]; in mpi3mr_process_op_reply_q()
542 WRITE_ONCE(op_req_q->ci, le16_to_cpu(reply_desc->request_queue_ci)); in mpi3mr_process_op_reply_q()
545 atomic_dec(&op_reply_q->pend_ios); in mpi3mr_process_op_reply_q()
550 if (++reply_ci == op_reply_q->num_replies) { in mpi3mr_process_op_reply_q()
557 if ((le16_to_cpu(reply_desc->reply_flags) & in mpi3mr_process_op_reply_q()
565 if (num_op_reply > mrioc->max_host_ios) { in mpi3mr_process_op_reply_q()
566 op_reply_q->enable_irq_poll = true; in mpi3mr_process_op_reply_q()
573 &mrioc->sysif_regs->oper_queue_indexes[reply_qidx].consumer_index); in mpi3mr_process_op_reply_q()
574 op_reply_q->ci = reply_ci; in mpi3mr_process_op_reply_q()
575 op_reply_q->ephase = exp_phase; in mpi3mr_process_op_reply_q()
577 atomic_dec(&op_reply_q->in_use); in mpi3mr_process_op_reply_q()
582 * mpi3mr_blk_mq_poll - Operational reply queue handler
586 * Checks the specific operational reply queue and drains the
598 mrioc = (struct mpi3mr_ioc *)shost->hostdata; in mpi3mr_blk_mq_poll()
600 if ((mrioc->reset_in_progress || mrioc->prepare_for_reset || in mpi3mr_blk_mq_poll()
601 mrioc->unrecoverable)) in mpi3mr_blk_mq_poll()
605 &mrioc->op_reply_qinfo[queue_num]); in mpi3mr_blk_mq_poll()
620 mrioc = intr_info->mrioc; in mpi3mr_isr_primary()
622 if (!mrioc->intr_enabled) in mpi3mr_isr_primary()
625 midx = intr_info->msix_index; in mpi3mr_isr_primary()
629 if (intr_info->op_reply_q) in mpi3mr_isr_primary()
631 intr_info->op_reply_q); in mpi3mr_isr_primary()
656 if (!intr_info->op_reply_q) in mpi3mr_isr()
659 if (!intr_info->op_reply_q->enable_irq_poll || in mpi3mr_isr()
660 !atomic_read(&intr_info->op_reply_q->pend_ios)) in mpi3mr_isr()
663 disable_irq_nosync(intr_info->os_irq); in mpi3mr_isr()
669 * mpi3mr_isr_poll - Reply queue polling routine
685 if (!intr_info || !intr_info->op_reply_q) in mpi3mr_isr_poll()
688 mrioc = intr_info->mrioc; in mpi3mr_isr_poll()
689 midx = intr_info->msix_index; in mpi3mr_isr_poll()
693 if (!mrioc->intr_enabled || mrioc->unrecoverable) in mpi3mr_isr_poll()
698 if (intr_info->op_reply_q) in mpi3mr_isr_poll()
701 intr_info->op_reply_q); in mpi3mr_isr_poll()
705 } while (atomic_read(&intr_info->op_reply_q->pend_ios) && in mpi3mr_isr_poll()
706 (num_op_reply < mrioc->max_host_ios)); in mpi3mr_isr_poll()
708 intr_info->op_reply_q->enable_irq_poll = false; in mpi3mr_isr_poll()
709 enable_irq(intr_info->os_irq); in mpi3mr_isr_poll()
717 * mpi3mr_request_irq - Request IRQ and register ISR
723 * Return: 0 on success and non zero on failures.
727 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_request_irq()
728 struct mpi3mr_intr_info *intr_info = mrioc->intr_info + index; in mpi3mr_request_irq()
731 intr_info->mrioc = mrioc; in mpi3mr_request_irq()
732 intr_info->msix_index = index; in mpi3mr_request_irq()
733 intr_info->op_reply_q = NULL; in mpi3mr_request_irq()
735 snprintf(intr_info->name, MPI3MR_NAME_LENGTH, "%s%d-msix%d", in mpi3mr_request_irq()
736 mrioc->driver_name, mrioc->id, index); in mpi3mr_request_irq()
740 mpi3mr_isr_poll, IRQF_SHARED, intr_info->name, intr_info); in mpi3mr_request_irq()
743 NULL, IRQF_SHARED, intr_info->name, intr_info); in mpi3mr_request_irq()
747 intr_info->name, pci_irq_vector(pdev, index)); in mpi3mr_request_irq()
751 intr_info->os_irq = pci_irq_vector(pdev, index); in mpi3mr_request_irq()
757 if (!mrioc->requested_poll_qcount) in mpi3mr_calc_poll_queues()
762 (mrioc->requested_poll_qcount < max_vectors - 2)) { in mpi3mr_calc_poll_queues()
765 mrioc->requested_poll_qcount, max_vectors); in mpi3mr_calc_poll_queues()
769 mrioc->requested_poll_qcount, max_vectors); in mpi3mr_calc_poll_queues()
770 mrioc->requested_poll_qcount = 0; in mpi3mr_calc_poll_queues()
775 * mpi3mr_setup_isr - Setup ISR for the controller
781 * Return: 0 on success and non zero on failures.
791 if (mrioc->is_intr_info_set) in mpi3mr_setup_isr()
798 retval = pci_alloc_irq_vectors(mrioc->pdev, in mpi3mr_setup_isr()
807 min_t(int, mrioc->cpu_count + 1 + in mpi3mr_setup_isr()
808 mrioc->requested_poll_qcount, mrioc->msix_count); in mpi3mr_setup_isr()
813 "MSI-X vectors supported: %d, no of cores: %d,", in mpi3mr_setup_isr()
814 mrioc->msix_count, mrioc->cpu_count); in mpi3mr_setup_isr()
816 "MSI-x vectors requested: %d poll_queues %d\n", in mpi3mr_setup_isr()
817 max_vectors, mrioc->requested_poll_qcount); in mpi3mr_setup_isr()
819 desc.post_vectors = mrioc->requested_poll_qcount; in mpi3mr_setup_isr()
823 retval = pci_alloc_irq_vectors_affinity(mrioc->pdev, in mpi3mr_setup_isr()
834 * If only one MSI-x is allocated, then MSI-x 0 will be shared in mpi3mr_setup_isr()
835 * between Admin queue and operational queue in mpi3mr_setup_isr()
838 mrioc->op_reply_q_offset = 0; in mpi3mr_setup_isr()
846 mrioc->op_reply_q_offset = (max_vectors > 1) ? 1 : 0; in mpi3mr_setup_isr()
852 mrioc->intr_info = kzalloc(sizeof(struct mpi3mr_intr_info) * max_vectors, in mpi3mr_setup_isr()
854 if (!mrioc->intr_info) { in mpi3mr_setup_isr()
855 retval = -ENOMEM; in mpi3mr_setup_isr()
856 pci_free_irq_vectors(mrioc->pdev); in mpi3mr_setup_isr()
862 mrioc->intr_info_count = i; in mpi3mr_setup_isr()
867 mrioc->is_intr_info_set = true; in mpi3mr_setup_isr()
868 mrioc->intr_info_count = max_vectors; in mpi3mr_setup_isr()
950 * mpi3mr_reset_rc_name - get reset reason code name
981 * mpi3mr_reset_type_name - get reset type name
1003 * mpi3mr_print_fault_info - Display fault information
1015 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_print_fault_info()
1018 code = readl(&mrioc->sysif_regs->fault); in mpi3mr_print_fault_info()
1019 code1 = readl(&mrioc->sysif_regs->fault_info[0]); in mpi3mr_print_fault_info()
1020 code2 = readl(&mrioc->sysif_regs->fault_info[1]); in mpi3mr_print_fault_info()
1021 code3 = readl(&mrioc->sysif_regs->fault_info[2]); in mpi3mr_print_fault_info()
1030 * mpi3mr_get_iocstate - Get IOC State
1043 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_get_iocstate()
1044 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_get_iocstate()
1046 if (mrioc->unrecoverable) in mpi3mr_get_iocstate()
1065 * mpi3mr_clear_reset_history - clear reset history
1077 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_clear_reset_history()
1079 writel(ioc_status, &mrioc->sysif_regs->ioc_status); in mpi3mr_clear_reset_history()
1083 * mpi3mr_issue_and_process_mur - Message unit Reset handler
1090 * Return: 0 on success, -1 on failure.
1096 int retval = -1; in mpi3mr_issue_and_process_mur()
1099 if (mrioc->unrecoverable) { in mpi3mr_issue_and_process_mur()
1104 writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]); in mpi3mr_issue_and_process_mur()
1105 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1107 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1111 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_and_process_mur()
1121 } while (--timeout); in mpi3mr_issue_and_process_mur()
1123 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1135 * mpi3mr_revalidate_factsdata - validate IOCFacts parameters
1140 * older values else return -EPERM
1147 if (mrioc->facts.reply_sz > mrioc->reply_sz) { in mpi3mr_revalidate_factsdata()
1150 mrioc->reply_sz, mrioc->facts.reply_sz); in mpi3mr_revalidate_factsdata()
1151 return -EPERM; in mpi3mr_revalidate_factsdata()
1154 if (mrioc->facts.max_op_reply_q < mrioc->num_op_reply_q) { in mpi3mr_revalidate_factsdata()
1156 "cannot reduce number of operational reply queues from %d to %d\n", in mpi3mr_revalidate_factsdata()
1157 mrioc->num_op_reply_q, in mpi3mr_revalidate_factsdata()
1158 mrioc->facts.max_op_reply_q); in mpi3mr_revalidate_factsdata()
1159 return -EPERM; in mpi3mr_revalidate_factsdata()
1162 if (mrioc->facts.max_op_req_q < mrioc->num_op_req_q) { in mpi3mr_revalidate_factsdata()
1164 "cannot reduce number of operational request queues from %d to %d\n", in mpi3mr_revalidate_factsdata()
1165 mrioc->num_op_req_q, mrioc->facts.max_op_req_q); in mpi3mr_revalidate_factsdata()
1166 return -EPERM; in mpi3mr_revalidate_factsdata()
1169 if (mrioc->shost->max_sectors != (mrioc->facts.max_data_length / 512)) in mpi3mr_revalidate_factsdata()
1173 mrioc->shost->max_sectors * 512, mrioc->facts.max_data_length); in mpi3mr_revalidate_factsdata()
1175 if ((mrioc->sas_transport_enabled) && (mrioc->facts.ioc_capabilities & in mpi3mr_revalidate_factsdata()
1182 if (mrioc->facts.max_devhandle > mrioc->dev_handle_bitmap_bits) { in mpi3mr_revalidate_factsdata()
1183 removepend_bitmap = bitmap_zalloc(mrioc->facts.max_devhandle, in mpi3mr_revalidate_factsdata()
1188 mrioc->dev_handle_bitmap_bits, in mpi3mr_revalidate_factsdata()
1189 mrioc->facts.max_devhandle); in mpi3mr_revalidate_factsdata()
1190 return -EPERM; in mpi3mr_revalidate_factsdata()
1192 bitmap_free(mrioc->removepend_bitmap); in mpi3mr_revalidate_factsdata()
1193 mrioc->removepend_bitmap = removepend_bitmap; in mpi3mr_revalidate_factsdata()
1196 mrioc->dev_handle_bitmap_bits, in mpi3mr_revalidate_factsdata()
1197 mrioc->facts.max_devhandle); in mpi3mr_revalidate_factsdata()
1198 mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle; in mpi3mr_revalidate_factsdata()
1205 * mpi3mr_bring_ioc_ready - Bring controller to ready state
1220 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_bring_ioc_ready()
1221 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1222 base_info = lo_hi_readq(&mrioc->sysif_regs->ioc_information); in mpi3mr_bring_ioc_ready()
1227 mrioc->ready_timeout = in mpi3mr_bring_ioc_ready()
1231 ioc_info(mrioc, "ready timeout: %d seconds\n", mrioc->ready_timeout); in mpi3mr_bring_ioc_ready()
1239 timeout = mrioc->ready_timeout * 10; in mpi3mr_bring_ioc_ready()
1242 } while (--timeout); in mpi3mr_bring_ioc_ready()
1244 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1245 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1248 retval = -1; in mpi3mr_bring_ioc_ready()
1274 readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_bring_ioc_ready()
1278 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1279 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1284 } while (--timeout); in mpi3mr_bring_ioc_ready()
1313 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1315 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1317 timeout = mrioc->ready_timeout * 10; in mpi3mr_bring_ioc_ready()
1326 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1327 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1330 retval = -1; in mpi3mr_bring_ioc_ready()
1334 } while (--timeout); in mpi3mr_bring_ioc_ready()
1346 * mpi3mr_soft_reset_success - Check softreset is success or not
1365 * mpi3mr_diagfault_success - Check diag fault is success or not
1380 fault = readl(&mrioc->sysif_regs->fault) & MPI3_SYSIF_FAULT_CODE_MASK; in mpi3mr_diagfault_success()
1389 * mpi3mr_set_diagsave - Set diag save bit for snapdump
1401 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_set_diagsave()
1403 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_set_diagsave()
1407 * mpi3mr_issue_reset - Issue reset to the controller
1417 * Return: 0 on success, non-zero on failure.
1422 int retval = -1; in mpi3mr_issue_reset()
1430 if (mrioc->unrecoverable) in mpi3mr_issue_reset()
1451 mrioc->unrecoverable = 1; in mpi3mr_issue_reset()
1456 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1458 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1460 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1462 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1464 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1466 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1468 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1470 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_issue_reset()
1476 writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]); in mpi3mr_issue_reset()
1478 &mrioc->sysif_regs->host_diagnostic); in mpi3mr_issue_reset()
1482 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1484 readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_reset()
1493 } while (--timeout); in mpi3mr_issue_reset()
1498 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1504 } while (--timeout); in mpi3mr_issue_reset()
1511 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1513 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_reset()
1514 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1520 mrioc->unrecoverable = 1; in mpi3mr_issue_reset()
1525 * mpi3mr_admin_request_post - Post request to admin queue
1535 * Return: 0 on success, non-zero on failure.
1545 if (mrioc->unrecoverable) { in mpi3mr_admin_request_post()
1547 return -EFAULT; in mpi3mr_admin_request_post()
1550 spin_lock_irqsave(&mrioc->admin_req_lock, flags); in mpi3mr_admin_request_post()
1551 areq_pi = mrioc->admin_req_pi; in mpi3mr_admin_request_post()
1552 areq_ci = mrioc->admin_req_ci; in mpi3mr_admin_request_post()
1553 max_entries = mrioc->num_admin_req; in mpi3mr_admin_request_post()
1555 (areq_pi == (max_entries - 1)))) { in mpi3mr_admin_request_post()
1557 retval = -EAGAIN; in mpi3mr_admin_request_post()
1560 if (!ignore_reset && mrioc->reset_in_progress) { in mpi3mr_admin_request_post()
1562 retval = -EAGAIN; in mpi3mr_admin_request_post()
1565 areq_entry = (u8 *)mrioc->admin_req_base + in mpi3mr_admin_request_post()
1572 mrioc->admin_req_pi = areq_pi; in mpi3mr_admin_request_post()
1574 writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi); in mpi3mr_admin_request_post()
1577 spin_unlock_irqrestore(&mrioc->admin_req_lock, flags); in mpi3mr_admin_request_post()
1583 * mpi3mr_free_op_req_q_segments - free request memory segments
1585 * @q_idx: operational request queue index
1587 * Free memory segments allocated for operational request queue
1597 segments = mrioc->req_qinfo[q_idx].q_segments; in mpi3mr_free_op_req_q_segments()
1601 if (mrioc->enable_segqueue) { in mpi3mr_free_op_req_q_segments()
1603 if (mrioc->req_qinfo[q_idx].q_segment_list) { in mpi3mr_free_op_req_q_segments()
1604 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_req_q_segments()
1606 mrioc->req_qinfo[q_idx].q_segment_list, in mpi3mr_free_op_req_q_segments()
1607 mrioc->req_qinfo[q_idx].q_segment_list_dma); in mpi3mr_free_op_req_q_segments()
1608 mrioc->req_qinfo[q_idx].q_segment_list = NULL; in mpi3mr_free_op_req_q_segments()
1611 size = mrioc->req_qinfo[q_idx].segment_qd * in mpi3mr_free_op_req_q_segments()
1612 mrioc->facts.op_req_sz; in mpi3mr_free_op_req_q_segments()
1614 for (j = 0; j < mrioc->req_qinfo[q_idx].num_segments; j++) { in mpi3mr_free_op_req_q_segments()
1617 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_req_q_segments()
1621 kfree(mrioc->req_qinfo[q_idx].q_segments); in mpi3mr_free_op_req_q_segments()
1622 mrioc->req_qinfo[q_idx].q_segments = NULL; in mpi3mr_free_op_req_q_segments()
1623 mrioc->req_qinfo[q_idx].qid = 0; in mpi3mr_free_op_req_q_segments()
1627 * mpi3mr_free_op_reply_q_segments - free reply memory segments
1629 * @q_idx: operational reply queue index
1631 * Free memory segments allocated for operational reply queue
1641 segments = mrioc->op_reply_qinfo[q_idx].q_segments; in mpi3mr_free_op_reply_q_segments()
1645 if (mrioc->enable_segqueue) { in mpi3mr_free_op_reply_q_segments()
1647 if (mrioc->op_reply_qinfo[q_idx].q_segment_list) { in mpi3mr_free_op_reply_q_segments()
1648 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_reply_q_segments()
1650 mrioc->op_reply_qinfo[q_idx].q_segment_list, in mpi3mr_free_op_reply_q_segments()
1651 mrioc->op_reply_qinfo[q_idx].q_segment_list_dma); in mpi3mr_free_op_reply_q_segments()
1652 mrioc->op_reply_qinfo[q_idx].q_segment_list = NULL; in mpi3mr_free_op_reply_q_segments()
1655 size = mrioc->op_reply_qinfo[q_idx].segment_qd * in mpi3mr_free_op_reply_q_segments()
1656 mrioc->op_reply_desc_sz; in mpi3mr_free_op_reply_q_segments()
1658 for (j = 0; j < mrioc->op_reply_qinfo[q_idx].num_segments; j++) { in mpi3mr_free_op_reply_q_segments()
1661 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_reply_q_segments()
1666 kfree(mrioc->op_reply_qinfo[q_idx].q_segments); in mpi3mr_free_op_reply_q_segments()
1667 mrioc->op_reply_qinfo[q_idx].q_segments = NULL; in mpi3mr_free_op_reply_q_segments()
1668 mrioc->op_reply_qinfo[q_idx].qid = 0; in mpi3mr_free_op_reply_q_segments()
1672 * mpi3mr_delete_op_reply_q - delete operational reply queue
1674 * @qidx: operational reply queue index
1679 * Return: 0 on success, non-zero on failure.
1684 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_delete_op_reply_q()
1688 reply_qid = op_reply_q->qid; in mpi3mr_delete_op_reply_q()
1690 midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, mrioc->op_reply_q_offset); in mpi3mr_delete_op_reply_q()
1693 retval = -1; in mpi3mr_delete_op_reply_q()
1698 (op_reply_q->qtype == MPI3MR_DEFAULT_QUEUE) ? mrioc->default_qcount-- : in mpi3mr_delete_op_reply_q()
1699 mrioc->active_poll_qcount--; in mpi3mr_delete_op_reply_q()
1702 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1703 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_delete_op_reply_q()
1704 retval = -1; in mpi3mr_delete_op_reply_q()
1706 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1709 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_delete_op_reply_q()
1710 mrioc->init_cmds.is_waiting = 1; in mpi3mr_delete_op_reply_q()
1711 mrioc->init_cmds.callback = NULL; in mpi3mr_delete_op_reply_q()
1716 init_completion(&mrioc->init_cmds.done); in mpi3mr_delete_op_reply_q()
1723 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_delete_op_reply_q()
1725 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_delete_op_reply_q()
1729 retval = -1; in mpi3mr_delete_op_reply_q()
1732 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_delete_op_reply_q()
1736 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_delete_op_reply_q()
1737 mrioc->init_cmds.ioc_loginfo); in mpi3mr_delete_op_reply_q()
1738 retval = -1; in mpi3mr_delete_op_reply_q()
1741 mrioc->intr_info[midx].op_reply_q = NULL; in mpi3mr_delete_op_reply_q()
1745 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_delete_op_reply_q()
1746 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1753 * mpi3mr_alloc_op_reply_q_segments -Alloc segmented reply pool
1757 * Allocate segmented memory pools for operational reply
1760 * Return: 0 on success, non-zero on failure.
1764 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_alloc_op_reply_q_segments()
1769 if (mrioc->enable_segqueue) { in mpi3mr_alloc_op_reply_q_segments()
1770 op_reply_q->segment_qd = in mpi3mr_alloc_op_reply_q_segments()
1771 MPI3MR_OP_REP_Q_SEG_SIZE / mrioc->op_reply_desc_sz; in mpi3mr_alloc_op_reply_q_segments()
1775 op_reply_q->q_segment_list = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_reply_q_segments()
1776 MPI3MR_MAX_SEG_LIST_SIZE, &op_reply_q->q_segment_list_dma, in mpi3mr_alloc_op_reply_q_segments()
1778 if (!op_reply_q->q_segment_list) in mpi3mr_alloc_op_reply_q_segments()
1779 return -ENOMEM; in mpi3mr_alloc_op_reply_q_segments()
1780 q_segment_list_entry = (u64 *)op_reply_q->q_segment_list; in mpi3mr_alloc_op_reply_q_segments()
1782 op_reply_q->segment_qd = op_reply_q->num_replies; in mpi3mr_alloc_op_reply_q_segments()
1783 size = op_reply_q->num_replies * mrioc->op_reply_desc_sz; in mpi3mr_alloc_op_reply_q_segments()
1786 op_reply_q->num_segments = DIV_ROUND_UP(op_reply_q->num_replies, in mpi3mr_alloc_op_reply_q_segments()
1787 op_reply_q->segment_qd); in mpi3mr_alloc_op_reply_q_segments()
1789 op_reply_q->q_segments = kcalloc(op_reply_q->num_segments, in mpi3mr_alloc_op_reply_q_segments()
1791 if (!op_reply_q->q_segments) in mpi3mr_alloc_op_reply_q_segments()
1792 return -ENOMEM; in mpi3mr_alloc_op_reply_q_segments()
1794 segments = op_reply_q->q_segments; in mpi3mr_alloc_op_reply_q_segments()
1795 for (i = 0; i < op_reply_q->num_segments; i++) { in mpi3mr_alloc_op_reply_q_segments()
1797 dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_reply_q_segments()
1800 return -ENOMEM; in mpi3mr_alloc_op_reply_q_segments()
1801 if (mrioc->enable_segqueue) in mpi3mr_alloc_op_reply_q_segments()
1810 * mpi3mr_alloc_op_req_q_segments - Alloc segmented req pool.
1814 * Allocate segmented memory pools for operational request
1817 * Return: 0 on success, non-zero on failure.
1821 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + qidx; in mpi3mr_alloc_op_req_q_segments()
1826 if (mrioc->enable_segqueue) { in mpi3mr_alloc_op_req_q_segments()
1827 op_req_q->segment_qd = in mpi3mr_alloc_op_req_q_segments()
1828 MPI3MR_OP_REQ_Q_SEG_SIZE / mrioc->facts.op_req_sz; in mpi3mr_alloc_op_req_q_segments()
1832 op_req_q->q_segment_list = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_req_q_segments()
1833 MPI3MR_MAX_SEG_LIST_SIZE, &op_req_q->q_segment_list_dma, in mpi3mr_alloc_op_req_q_segments()
1835 if (!op_req_q->q_segment_list) in mpi3mr_alloc_op_req_q_segments()
1836 return -ENOMEM; in mpi3mr_alloc_op_req_q_segments()
1837 q_segment_list_entry = (u64 *)op_req_q->q_segment_list; in mpi3mr_alloc_op_req_q_segments()
1840 op_req_q->segment_qd = op_req_q->num_requests; in mpi3mr_alloc_op_req_q_segments()
1841 size = op_req_q->num_requests * mrioc->facts.op_req_sz; in mpi3mr_alloc_op_req_q_segments()
1844 op_req_q->num_segments = DIV_ROUND_UP(op_req_q->num_requests, in mpi3mr_alloc_op_req_q_segments()
1845 op_req_q->segment_qd); in mpi3mr_alloc_op_req_q_segments()
1847 op_req_q->q_segments = kcalloc(op_req_q->num_segments, in mpi3mr_alloc_op_req_q_segments()
1849 if (!op_req_q->q_segments) in mpi3mr_alloc_op_req_q_segments()
1850 return -ENOMEM; in mpi3mr_alloc_op_req_q_segments()
1852 segments = op_req_q->q_segments; in mpi3mr_alloc_op_req_q_segments()
1853 for (i = 0; i < op_req_q->num_segments; i++) { in mpi3mr_alloc_op_req_q_segments()
1855 dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_req_q_segments()
1858 return -ENOMEM; in mpi3mr_alloc_op_req_q_segments()
1859 if (mrioc->enable_segqueue) in mpi3mr_alloc_op_req_q_segments()
1868 * mpi3mr_create_op_reply_q - create operational reply queue
1870 * @qidx: operational reply queue index
1875 * Return: 0 on success, non-zero on failure.
1880 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_create_op_reply_q()
1884 reply_qid = op_reply_q->qid; in mpi3mr_create_op_reply_q()
1886 midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, mrioc->op_reply_q_offset); in mpi3mr_create_op_reply_q()
1889 retval = -1; in mpi3mr_create_op_reply_q()
1897 op_reply_q->num_replies = MPI3MR_OP_REP_Q_QD; in mpi3mr_create_op_reply_q()
1898 if ((mrioc->pdev->device == MPI3_MFGPAGE_DEVID_SAS4116) && in mpi3mr_create_op_reply_q()
1899 !mrioc->pdev->revision) in mpi3mr_create_op_reply_q()
1900 op_reply_q->num_replies = MPI3MR_OP_REP_Q_QD4K; in mpi3mr_create_op_reply_q()
1901 op_reply_q->ci = 0; in mpi3mr_create_op_reply_q()
1902 op_reply_q->ephase = 1; in mpi3mr_create_op_reply_q()
1903 atomic_set(&op_reply_q->pend_ios, 0); in mpi3mr_create_op_reply_q()
1904 atomic_set(&op_reply_q->in_use, 0); in mpi3mr_create_op_reply_q()
1905 op_reply_q->enable_irq_poll = false; in mpi3mr_create_op_reply_q()
1907 if (!op_reply_q->q_segments) { in mpi3mr_create_op_reply_q()
1916 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_reply_q()
1917 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_create_op_reply_q()
1918 retval = -1; in mpi3mr_create_op_reply_q()
1922 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_create_op_reply_q()
1923 mrioc->init_cmds.is_waiting = 1; in mpi3mr_create_op_reply_q()
1924 mrioc->init_cmds.callback = NULL; in mpi3mr_create_op_reply_q()
1929 if (midx < (mrioc->intr_info_count - mrioc->requested_poll_qcount)) in mpi3mr_create_op_reply_q()
1930 op_reply_q->qtype = MPI3MR_DEFAULT_QUEUE; in mpi3mr_create_op_reply_q()
1932 op_reply_q->qtype = MPI3MR_POLL_QUEUE; in mpi3mr_create_op_reply_q()
1934 if (op_reply_q->qtype == MPI3MR_DEFAULT_QUEUE) { in mpi3mr_create_op_reply_q()
1938 cpu_to_le16(mrioc->intr_info[midx].msix_index); in mpi3mr_create_op_reply_q()
1940 create_req.msix_index = cpu_to_le16(mrioc->intr_info_count - 1); in mpi3mr_create_op_reply_q()
1943 if (!mrioc->active_poll_qcount) in mpi3mr_create_op_reply_q()
1944 disable_irq_nosync(pci_irq_vector(mrioc->pdev, in mpi3mr_create_op_reply_q()
1945 mrioc->intr_info_count - 1)); in mpi3mr_create_op_reply_q()
1948 if (mrioc->enable_segqueue) { in mpi3mr_create_op_reply_q()
1952 op_reply_q->q_segment_list_dma); in mpi3mr_create_op_reply_q()
1955 op_reply_q->q_segments[0].segment_dma); in mpi3mr_create_op_reply_q()
1957 create_req.size = cpu_to_le16(op_reply_q->num_replies); in mpi3mr_create_op_reply_q()
1959 init_completion(&mrioc->init_cmds.done); in mpi3mr_create_op_reply_q()
1966 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_create_op_reply_q()
1968 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_create_op_reply_q()
1972 retval = -1; in mpi3mr_create_op_reply_q()
1975 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_create_op_reply_q()
1979 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_create_op_reply_q()
1980 mrioc->init_cmds.ioc_loginfo); in mpi3mr_create_op_reply_q()
1981 retval = -1; in mpi3mr_create_op_reply_q()
1984 op_reply_q->qid = reply_qid; in mpi3mr_create_op_reply_q()
1985 if (midx < mrioc->intr_info_count) in mpi3mr_create_op_reply_q()
1986 mrioc->intr_info[midx].op_reply_q = op_reply_q; in mpi3mr_create_op_reply_q()
1988 (op_reply_q->qtype == MPI3MR_DEFAULT_QUEUE) ? mrioc->default_qcount++ : in mpi3mr_create_op_reply_q()
1989 mrioc->active_poll_qcount++; in mpi3mr_create_op_reply_q()
1992 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_create_op_reply_q()
1993 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_reply_q()
2000 * mpi3mr_create_op_req_q - create operational request queue
2002 * @idx: operational request queue index
2008 * Return: 0 on success, non-zero on failure.
2014 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + idx; in mpi3mr_create_op_req_q()
2018 req_qid = op_req_q->qid; in mpi3mr_create_op_req_q()
2021 retval = -1; in mpi3mr_create_op_req_q()
2029 op_req_q->num_requests = MPI3MR_OP_REQ_Q_QD; in mpi3mr_create_op_req_q()
2030 op_req_q->ci = 0; in mpi3mr_create_op_req_q()
2031 op_req_q->pi = 0; in mpi3mr_create_op_req_q()
2032 op_req_q->reply_qid = reply_qid; in mpi3mr_create_op_req_q()
2033 spin_lock_init(&op_req_q->q_lock); in mpi3mr_create_op_req_q()
2035 if (!op_req_q->q_segments) { in mpi3mr_create_op_req_q()
2044 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_req_q()
2045 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_create_op_req_q()
2046 retval = -1; in mpi3mr_create_op_req_q()
2050 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_create_op_req_q()
2051 mrioc->init_cmds.is_waiting = 1; in mpi3mr_create_op_req_q()
2052 mrioc->init_cmds.callback = NULL; in mpi3mr_create_op_req_q()
2056 if (mrioc->enable_segqueue) { in mpi3mr_create_op_req_q()
2060 op_req_q->q_segment_list_dma); in mpi3mr_create_op_req_q()
2063 op_req_q->q_segments[0].segment_dma); in mpi3mr_create_op_req_q()
2065 create_req.size = cpu_to_le16(op_req_q->num_requests); in mpi3mr_create_op_req_q()
2067 init_completion(&mrioc->init_cmds.done); in mpi3mr_create_op_req_q()
2074 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_create_op_req_q()
2076 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_create_op_req_q()
2080 retval = -1; in mpi3mr_create_op_req_q()
2083 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_create_op_req_q()
2087 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_create_op_req_q()
2088 mrioc->init_cmds.ioc_loginfo); in mpi3mr_create_op_req_q()
2089 retval = -1; in mpi3mr_create_op_req_q()
2092 op_req_q->qid = req_qid; in mpi3mr_create_op_req_q()
2095 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_create_op_req_q()
2096 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_req_q()
2103 * mpi3mr_create_op_queues - create operational queue pairs
2106 * Allocate memory for operational queue meta data and call
2109 * Return: 0 on success, non-zero on failures.
2116 num_queues = min_t(int, mrioc->facts.max_op_reply_q, in mpi3mr_create_op_queues()
2117 mrioc->facts.max_op_req_q); in mpi3mr_create_op_queues()
2120 mrioc->intr_info_count - mrioc->op_reply_q_offset; in mpi3mr_create_op_queues()
2121 if (!mrioc->num_queues) in mpi3mr_create_op_queues()
2122 mrioc->num_queues = min_t(int, num_queues, msix_count_op_q); in mpi3mr_create_op_queues()
2127 num_queues = mrioc->num_op_reply_q ? in mpi3mr_create_op_queues()
2128 mrioc->num_op_reply_q : mrioc->num_queues; in mpi3mr_create_op_queues()
2129 ioc_info(mrioc, "trying to create %d operational queue pairs\n", in mpi3mr_create_op_queues()
2132 if (!mrioc->req_qinfo) { in mpi3mr_create_op_queues()
2133 mrioc->req_qinfo = kcalloc(num_queues, in mpi3mr_create_op_queues()
2135 if (!mrioc->req_qinfo) { in mpi3mr_create_op_queues()
2136 retval = -1; in mpi3mr_create_op_queues()
2140 mrioc->op_reply_qinfo = kzalloc(sizeof(struct op_reply_qinfo) * in mpi3mr_create_op_queues()
2142 if (!mrioc->op_reply_qinfo) { in mpi3mr_create_op_queues()
2143 retval = -1; in mpi3mr_create_op_queues()
2148 if (mrioc->enable_segqueue) in mpi3mr_create_op_queues()
2150 "allocating operational queues through segmented queues\n"); in mpi3mr_create_op_queues()
2158 mrioc->op_reply_qinfo[i].qid)) { in mpi3mr_create_op_queues()
2167 retval = -1; in mpi3mr_create_op_queues()
2170 mrioc->num_op_reply_q = mrioc->num_op_req_q = i; in mpi3mr_create_op_queues()
2172 "successfully created %d operational queue pairs(default/polled) queue = (%d/%d)\n", in mpi3mr_create_op_queues()
2173 mrioc->num_op_reply_q, mrioc->default_qcount, in mpi3mr_create_op_queues()
2174 mrioc->active_poll_qcount); in mpi3mr_create_op_queues()
2178 kfree(mrioc->req_qinfo); in mpi3mr_create_op_queues()
2179 mrioc->req_qinfo = NULL; in mpi3mr_create_op_queues()
2181 kfree(mrioc->op_reply_qinfo); in mpi3mr_create_op_queues()
2182 mrioc->op_reply_qinfo = NULL; in mpi3mr_create_op_queues()
2188 * mpi3mr_op_request_post - Post request to operational queue
2190 * @op_req_q: Operational request queue info
2193 * Post the MPI3 request into operational request queue and
2197 * Return: 0 on success, non-zero on failure.
2207 u16 req_sz = mrioc->facts.op_req_sz; in mpi3mr_op_request_post()
2208 struct segments *segments = op_req_q->q_segments; in mpi3mr_op_request_post()
2210 reply_qidx = op_req_q->reply_qid - 1; in mpi3mr_op_request_post()
2212 if (mrioc->unrecoverable) in mpi3mr_op_request_post()
2213 return -EFAULT; in mpi3mr_op_request_post()
2215 spin_lock_irqsave(&op_req_q->q_lock, flags); in mpi3mr_op_request_post()
2216 pi = op_req_q->pi; in mpi3mr_op_request_post()
2217 max_entries = op_req_q->num_requests; in mpi3mr_op_request_post()
2221 reply_qidx, mrioc->op_reply_q_offset); in mpi3mr_op_request_post()
2222 mpi3mr_process_op_reply_q(mrioc, mrioc->intr_info[midx].op_reply_q); in mpi3mr_op_request_post()
2225 retval = -EAGAIN; in mpi3mr_op_request_post()
2230 if (mrioc->reset_in_progress) { in mpi3mr_op_request_post()
2232 retval = -EAGAIN; in mpi3mr_op_request_post()
2236 segment_base_addr = segments[pi / op_req_q->segment_qd].segment; in mpi3mr_op_request_post()
2238 ((pi % op_req_q->segment_qd) * req_sz); in mpi3mr_op_request_post()
2245 op_req_q->pi = pi; in mpi3mr_op_request_post()
2248 if (atomic_inc_return(&mrioc->op_reply_qinfo[reply_qidx].pend_ios) in mpi3mr_op_request_post()
2250 mrioc->op_reply_qinfo[reply_qidx].enable_irq_poll = true; in mpi3mr_op_request_post()
2252 atomic_inc_return(&mrioc->op_reply_qinfo[reply_qidx].pend_ios); in mpi3mr_op_request_post()
2255 writel(op_req_q->pi, in mpi3mr_op_request_post()
2256 &mrioc->sysif_regs->oper_queue_indexes[reply_qidx].producer_index); in mpi3mr_op_request_post()
2259 spin_unlock_irqrestore(&op_req_q->q_lock, flags); in mpi3mr_op_request_post()
2264 * mpi3mr_check_rh_fault_ioc - check reset history and fault
2281 if (mrioc->unrecoverable) { in mpi3mr_check_rh_fault_ioc()
2286 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_check_rh_fault_ioc()
2287 mrioc->unrecoverable = 1; in mpi3mr_check_rh_fault_ioc()
2292 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_check_rh_fault_ioc()
2303 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_check_rh_fault_ioc()
2307 } while (--timeout); in mpi3mr_check_rh_fault_ioc()
2311 * mpi3mr_sync_timestamp - Issue time stamp sync request
2317 * Return: 0 on success, non-zero on failure.
2326 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2327 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_sync_timestamp()
2328 retval = -1; in mpi3mr_sync_timestamp()
2330 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2333 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_sync_timestamp()
2334 mrioc->init_cmds.is_waiting = 1; in mpi3mr_sync_timestamp()
2335 mrioc->init_cmds.callback = NULL; in mpi3mr_sync_timestamp()
2342 init_completion(&mrioc->init_cmds.done); in mpi3mr_sync_timestamp()
2350 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_sync_timestamp()
2352 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_sync_timestamp()
2354 mrioc->init_cmds.is_waiting = 0; in mpi3mr_sync_timestamp()
2355 if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET)) in mpi3mr_sync_timestamp()
2358 retval = -1; in mpi3mr_sync_timestamp()
2361 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_sync_timestamp()
2365 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_sync_timestamp()
2366 mrioc->init_cmds.ioc_loginfo); in mpi3mr_sync_timestamp()
2367 retval = -1; in mpi3mr_sync_timestamp()
2372 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_sync_timestamp()
2373 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2380 * mpi3mr_print_pkg_ver - display controller fw package version
2386 * Return: 0 on success and non-zero on failure.
2391 int retval = -1; in mpi3mr_print_pkg_ver()
2398 data = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_print_pkg_ver()
2401 return -ENOMEM; in mpi3mr_print_pkg_ver()
2404 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2405 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_print_pkg_ver()
2407 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2410 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_print_pkg_ver()
2411 mrioc->init_cmds.is_waiting = 1; in mpi3mr_print_pkg_ver()
2412 mrioc->init_cmds.callback = NULL; in mpi3mr_print_pkg_ver()
2422 init_completion(&mrioc->init_cmds.done); in mpi3mr_print_pkg_ver()
2429 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_print_pkg_ver()
2431 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_print_pkg_ver()
2435 retval = -1; in mpi3mr_print_pkg_ver()
2438 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_print_pkg_ver()
2441 if (manifest->manifest_type == MPI3_CI_MANIFEST_TYPE_MPI) { in mpi3mr_print_pkg_ver()
2443 "firmware package version(%d.%d.%d.%d.%05d-%05d)\n", in mpi3mr_print_pkg_ver()
2444 manifest->package_version.gen_major, in mpi3mr_print_pkg_ver()
2445 manifest->package_version.gen_minor, in mpi3mr_print_pkg_ver()
2446 manifest->package_version.phase_major, in mpi3mr_print_pkg_ver()
2447 manifest->package_version.phase_minor, in mpi3mr_print_pkg_ver()
2448 manifest->package_version.customer_id, in mpi3mr_print_pkg_ver()
2449 manifest->package_version.build_num); in mpi3mr_print_pkg_ver()
2454 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_print_pkg_ver()
2455 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2459 dma_free_coherent(&mrioc->pdev->dev, data_len, data, in mpi3mr_print_pkg_ver()
2465 * mpi3mr_watchdog_work - watchdog thread to monitor faults
2483 if (mrioc->reset_in_progress) in mpi3mr_watchdog_work()
2486 if (!mrioc->unrecoverable && !pci_device_is_present(mrioc->pdev)) { in mpi3mr_watchdog_work()
2488 mrioc->unrecoverable = 1; in mpi3mr_watchdog_work()
2491 if (mrioc->unrecoverable) { in mpi3mr_watchdog_work()
2498 if (mrioc->ts_update_counter++ >= MPI3MR_TSUPDATE_INTERVAL) { in mpi3mr_watchdog_work()
2499 mrioc->ts_update_counter = 0; in mpi3mr_watchdog_work()
2503 if ((mrioc->prepare_for_reset) && in mpi3mr_watchdog_work()
2504 ((mrioc->prepare_for_reset_timeout_counter++) >= in mpi3mr_watchdog_work()
2511 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_watchdog_work()
2522 fault = readl(&mrioc->sysif_regs->fault) & MPI3_SYSIF_FAULT_CODE_MASK; in mpi3mr_watchdog_work()
2523 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_watchdog_work()
2525 if (!mrioc->diagsave_timeout) { in mpi3mr_watchdog_work()
2529 if ((mrioc->diagsave_timeout++) <= MPI3_SYSIF_DIAG_SAVE_TIMEOUT) in mpi3mr_watchdog_work()
2534 mrioc->diagsave_timeout = 0; in mpi3mr_watchdog_work()
2541 mrioc->unrecoverable = 1; in mpi3mr_watchdog_work()
2555 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_watchdog_work()
2556 if (mrioc->watchdog_work_q) in mpi3mr_watchdog_work()
2557 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_watchdog_work()
2558 &mrioc->watchdog_work, in mpi3mr_watchdog_work()
2560 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_watchdog_work()
2565 * mpi3mr_start_watchdog - Start watchdog
2575 if (mrioc->watchdog_work_q) in mpi3mr_start_watchdog()
2578 INIT_DELAYED_WORK(&mrioc->watchdog_work, mpi3mr_watchdog_work); in mpi3mr_start_watchdog()
2579 snprintf(mrioc->watchdog_work_q_name, in mpi3mr_start_watchdog()
2580 sizeof(mrioc->watchdog_work_q_name), "watchdog_%s%d", mrioc->name, in mpi3mr_start_watchdog()
2581 mrioc->id); in mpi3mr_start_watchdog()
2582 mrioc->watchdog_work_q = in mpi3mr_start_watchdog()
2583 create_singlethread_workqueue(mrioc->watchdog_work_q_name); in mpi3mr_start_watchdog()
2584 if (!mrioc->watchdog_work_q) { in mpi3mr_start_watchdog()
2589 if (mrioc->watchdog_work_q) in mpi3mr_start_watchdog()
2590 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_start_watchdog()
2591 &mrioc->watchdog_work, in mpi3mr_start_watchdog()
2596 * mpi3mr_stop_watchdog - Stop watchdog
2609 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_stop_watchdog()
2610 wq = mrioc->watchdog_work_q; in mpi3mr_stop_watchdog()
2611 mrioc->watchdog_work_q = NULL; in mpi3mr_stop_watchdog()
2612 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_stop_watchdog()
2614 if (!cancel_delayed_work_sync(&mrioc->watchdog_work)) in mpi3mr_stop_watchdog()
2621 * mpi3mr_setup_admin_qpair - Setup admin queue pair
2627 * Return: 0 on success, non-zero on failures.
2634 mrioc->admin_req_q_sz = MPI3MR_ADMIN_REQ_Q_SIZE; in mpi3mr_setup_admin_qpair()
2635 mrioc->num_admin_req = mrioc->admin_req_q_sz / in mpi3mr_setup_admin_qpair()
2637 mrioc->admin_req_ci = mrioc->admin_req_pi = 0; in mpi3mr_setup_admin_qpair()
2639 mrioc->admin_reply_q_sz = MPI3MR_ADMIN_REPLY_Q_SIZE; in mpi3mr_setup_admin_qpair()
2640 mrioc->num_admin_replies = mrioc->admin_reply_q_sz / in mpi3mr_setup_admin_qpair()
2642 mrioc->admin_reply_ci = 0; in mpi3mr_setup_admin_qpair()
2643 mrioc->admin_reply_ephase = 1; in mpi3mr_setup_admin_qpair()
2644 atomic_set(&mrioc->admin_reply_q_in_use, 0); in mpi3mr_setup_admin_qpair()
2646 if (!mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2647 mrioc->admin_req_base = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_setup_admin_qpair()
2648 mrioc->admin_req_q_sz, &mrioc->admin_req_dma, GFP_KERNEL); in mpi3mr_setup_admin_qpair()
2650 if (!mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2651 retval = -1; in mpi3mr_setup_admin_qpair()
2655 mrioc->admin_reply_base = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_setup_admin_qpair()
2656 mrioc->admin_reply_q_sz, &mrioc->admin_reply_dma, in mpi3mr_setup_admin_qpair()
2659 if (!mrioc->admin_reply_base) { in mpi3mr_setup_admin_qpair()
2660 retval = -1; in mpi3mr_setup_admin_qpair()
2665 num_admin_entries = (mrioc->num_admin_replies << 16) | in mpi3mr_setup_admin_qpair()
2666 (mrioc->num_admin_req); in mpi3mr_setup_admin_qpair()
2667 writel(num_admin_entries, &mrioc->sysif_regs->admin_queue_num_entries); in mpi3mr_setup_admin_qpair()
2668 mpi3mr_writeq(mrioc->admin_req_dma, in mpi3mr_setup_admin_qpair()
2669 &mrioc->sysif_regs->admin_request_queue_address); in mpi3mr_setup_admin_qpair()
2670 mpi3mr_writeq(mrioc->admin_reply_dma, in mpi3mr_setup_admin_qpair()
2671 &mrioc->sysif_regs->admin_reply_queue_address); in mpi3mr_setup_admin_qpair()
2672 writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi); in mpi3mr_setup_admin_qpair()
2673 writel(mrioc->admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci); in mpi3mr_setup_admin_qpair()
2678 if (mrioc->admin_reply_base) { in mpi3mr_setup_admin_qpair()
2679 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_reply_q_sz, in mpi3mr_setup_admin_qpair()
2680 mrioc->admin_reply_base, mrioc->admin_reply_dma); in mpi3mr_setup_admin_qpair()
2681 mrioc->admin_reply_base = NULL; in mpi3mr_setup_admin_qpair()
2683 if (mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2684 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_req_q_sz, in mpi3mr_setup_admin_qpair()
2685 mrioc->admin_req_base, mrioc->admin_req_dma); in mpi3mr_setup_admin_qpair()
2686 mrioc->admin_req_base = NULL; in mpi3mr_setup_admin_qpair()
2692 * mpi3mr_issue_iocfacts - Send IOC Facts
2699 * Return: 0 on success, non-zero on failures.
2711 data = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_issue_iocfacts()
2715 retval = -1; in mpi3mr_issue_iocfacts()
2720 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
2721 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_iocfacts()
2722 retval = -1; in mpi3mr_issue_iocfacts()
2724 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
2727 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_iocfacts()
2728 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_iocfacts()
2729 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_iocfacts()
2736 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_iocfacts()
2743 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_iocfacts()
2745 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_iocfacts()
2749 retval = -1; in mpi3mr_issue_iocfacts()
2752 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_iocfacts()
2756 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_iocfacts()
2757 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_iocfacts()
2758 retval = -1; in mpi3mr_issue_iocfacts()
2764 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_iocfacts()
2765 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
2769 dma_free_coherent(&mrioc->pdev->dev, data_len, data, data_dma); in mpi3mr_issue_iocfacts()
2775 * mpi3mr_check_reset_dma_mask - Process IOC facts data
2781 * Return: 0 on success, non-zero on failure.
2785 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_check_reset_dma_mask()
2787 u64 facts_dma_mask = DMA_BIT_MASK(mrioc->facts.dma_mask); in mpi3mr_check_reset_dma_mask()
2789 if (!mrioc->facts.dma_mask || (mrioc->dma_mask <= facts_dma_mask)) in mpi3mr_check_reset_dma_mask()
2793 mrioc->dma_mask, facts_dma_mask); in mpi3mr_check_reset_dma_mask()
2795 r = dma_set_mask_and_coherent(&pdev->dev, facts_dma_mask); in mpi3mr_check_reset_dma_mask()
2801 mrioc->dma_mask = facts_dma_mask; in mpi3mr_check_reset_dma_mask()
2806 * mpi3mr_process_factsdata - Process IOC facts data
2820 if ((le16_to_cpu(facts_data->ioc_facts_data_length)) != in mpi3mr_process_factsdata()
2825 le16_to_cpu(facts_data->ioc_facts_data_length) * 4); in mpi3mr_process_factsdata()
2828 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_process_factsdata()
2831 if (le16_to_cpu(facts_data->ioc_request_frame_size) != (req_sz / 4)) { in mpi3mr_process_factsdata()
2834 req_sz / 4, le16_to_cpu(facts_data->ioc_request_frame_size)); in mpi3mr_process_factsdata()
2837 memset(&mrioc->facts, 0, sizeof(mrioc->facts)); in mpi3mr_process_factsdata()
2839 facts_flags = le32_to_cpu(facts_data->flags); in mpi3mr_process_factsdata()
2840 mrioc->facts.op_req_sz = req_sz; in mpi3mr_process_factsdata()
2841 mrioc->op_reply_desc_sz = 1 << ((ioc_config & in mpi3mr_process_factsdata()
2845 mrioc->facts.ioc_num = facts_data->ioc_number; in mpi3mr_process_factsdata()
2846 mrioc->facts.who_init = facts_data->who_init; in mpi3mr_process_factsdata()
2847 mrioc->facts.max_msix_vectors = le16_to_cpu(facts_data->max_msix_vectors); in mpi3mr_process_factsdata()
2848 mrioc->facts.personality = (facts_flags & in mpi3mr_process_factsdata()
2850 mrioc->facts.dma_mask = (facts_flags & in mpi3mr_process_factsdata()
2853 mrioc->facts.protocol_flags = facts_data->protocol_flags; in mpi3mr_process_factsdata()
2854 mrioc->facts.mpi_version = le32_to_cpu(facts_data->mpi_version.word); in mpi3mr_process_factsdata()
2855 mrioc->facts.max_reqs = le16_to_cpu(facts_data->max_outstanding_requests); in mpi3mr_process_factsdata()
2856 mrioc->facts.product_id = le16_to_cpu(facts_data->product_id); in mpi3mr_process_factsdata()
2857 mrioc->facts.reply_sz = le16_to_cpu(facts_data->reply_frame_size) * 4; in mpi3mr_process_factsdata()
2858 mrioc->facts.exceptions = le16_to_cpu(facts_data->ioc_exceptions); in mpi3mr_process_factsdata()
2859 mrioc->facts.max_perids = le16_to_cpu(facts_data->max_persistent_id); in mpi3mr_process_factsdata()
2860 mrioc->facts.max_vds = le16_to_cpu(facts_data->max_vds); in mpi3mr_process_factsdata()
2861 mrioc->facts.max_hpds = le16_to_cpu(facts_data->max_host_pds); in mpi3mr_process_factsdata()
2862 mrioc->facts.max_advhpds = le16_to_cpu(facts_data->max_adv_host_pds); in mpi3mr_process_factsdata()
2863 mrioc->facts.max_raid_pds = le16_to_cpu(facts_data->max_raid_pds); in mpi3mr_process_factsdata()
2864 mrioc->facts.max_nvme = le16_to_cpu(facts_data->max_nvme); in mpi3mr_process_factsdata()
2865 mrioc->facts.max_pcie_switches = in mpi3mr_process_factsdata()
2866 le16_to_cpu(facts_data->max_pcie_switches); in mpi3mr_process_factsdata()
2867 mrioc->facts.max_sasexpanders = in mpi3mr_process_factsdata()
2868 le16_to_cpu(facts_data->max_sas_expanders); in mpi3mr_process_factsdata()
2869 mrioc->facts.max_data_length = le16_to_cpu(facts_data->max_data_length); in mpi3mr_process_factsdata()
2870 mrioc->facts.max_sasinitiators = in mpi3mr_process_factsdata()
2871 le16_to_cpu(facts_data->max_sas_initiators); in mpi3mr_process_factsdata()
2872 mrioc->facts.max_enclosures = le16_to_cpu(facts_data->max_enclosures); in mpi3mr_process_factsdata()
2873 mrioc->facts.min_devhandle = le16_to_cpu(facts_data->min_dev_handle); in mpi3mr_process_factsdata()
2874 mrioc->facts.max_devhandle = le16_to_cpu(facts_data->max_dev_handle); in mpi3mr_process_factsdata()
2875 mrioc->facts.max_op_req_q = in mpi3mr_process_factsdata()
2876 le16_to_cpu(facts_data->max_operational_request_queues); in mpi3mr_process_factsdata()
2877 mrioc->facts.max_op_reply_q = in mpi3mr_process_factsdata()
2878 le16_to_cpu(facts_data->max_operational_reply_queues); in mpi3mr_process_factsdata()
2879 mrioc->facts.ioc_capabilities = in mpi3mr_process_factsdata()
2880 le32_to_cpu(facts_data->ioc_capabilities); in mpi3mr_process_factsdata()
2881 mrioc->facts.fw_ver.build_num = in mpi3mr_process_factsdata()
2882 le16_to_cpu(facts_data->fw_version.build_num); in mpi3mr_process_factsdata()
2883 mrioc->facts.fw_ver.cust_id = in mpi3mr_process_factsdata()
2884 le16_to_cpu(facts_data->fw_version.customer_id); in mpi3mr_process_factsdata()
2885 mrioc->facts.fw_ver.ph_minor = facts_data->fw_version.phase_minor; in mpi3mr_process_factsdata()
2886 mrioc->facts.fw_ver.ph_major = facts_data->fw_version.phase_major; in mpi3mr_process_factsdata()
2887 mrioc->facts.fw_ver.gen_minor = facts_data->fw_version.gen_minor; in mpi3mr_process_factsdata()
2888 mrioc->facts.fw_ver.gen_major = facts_data->fw_version.gen_major; in mpi3mr_process_factsdata()
2889 mrioc->msix_count = min_t(int, mrioc->msix_count, in mpi3mr_process_factsdata()
2890 mrioc->facts.max_msix_vectors); in mpi3mr_process_factsdata()
2891 mrioc->facts.sge_mod_mask = facts_data->sge_modifier_mask; in mpi3mr_process_factsdata()
2892 mrioc->facts.sge_mod_value = facts_data->sge_modifier_value; in mpi3mr_process_factsdata()
2893 mrioc->facts.sge_mod_shift = facts_data->sge_modifier_shift; in mpi3mr_process_factsdata()
2894 mrioc->facts.shutdown_timeout = in mpi3mr_process_factsdata()
2895 le16_to_cpu(facts_data->shutdown_timeout); in mpi3mr_process_factsdata()
2897 mrioc->facts.max_dev_per_tg = in mpi3mr_process_factsdata()
2898 facts_data->max_devices_per_throttle_group; in mpi3mr_process_factsdata()
2899 mrioc->facts.io_throttle_data_length = in mpi3mr_process_factsdata()
2900 le16_to_cpu(facts_data->io_throttle_data_length); in mpi3mr_process_factsdata()
2901 mrioc->facts.max_io_throttle_group = in mpi3mr_process_factsdata()
2902 le16_to_cpu(facts_data->max_io_throttle_group); in mpi3mr_process_factsdata()
2903 mrioc->facts.io_throttle_low = le16_to_cpu(facts_data->io_throttle_low); in mpi3mr_process_factsdata()
2904 mrioc->facts.io_throttle_high = in mpi3mr_process_factsdata()
2905 le16_to_cpu(facts_data->io_throttle_high); in mpi3mr_process_factsdata()
2907 if (mrioc->facts.max_data_length == in mpi3mr_process_factsdata()
2909 mrioc->facts.max_data_length = MPI3MR_DEFAULT_MAX_IO_SIZE; in mpi3mr_process_factsdata()
2911 mrioc->facts.max_data_length *= MPI3MR_PAGE_SIZE_4K; in mpi3mr_process_factsdata()
2913 if (mrioc->facts.io_throttle_data_length) in mpi3mr_process_factsdata()
2914 mrioc->io_throttle_data_length = in mpi3mr_process_factsdata()
2915 (mrioc->facts.io_throttle_data_length * 2 * 4); in mpi3mr_process_factsdata()
2918 mrioc->io_throttle_data_length = (mrioc->facts.max_data_length / 512) + 2; in mpi3mr_process_factsdata()
2920 mrioc->io_throttle_high = (mrioc->facts.io_throttle_high * 2 * 1024); in mpi3mr_process_factsdata()
2921 mrioc->io_throttle_low = (mrioc->facts.io_throttle_low * 2 * 1024); in mpi3mr_process_factsdata()
2924 mrioc->facts.ioc_num, mrioc->facts.max_op_req_q, in mpi3mr_process_factsdata()
2925 mrioc->facts.max_op_reply_q, mrioc->facts.max_devhandle); in mpi3mr_process_factsdata()
2928 mrioc->facts.max_reqs, mrioc->facts.min_devhandle, in mpi3mr_process_factsdata()
2929 mrioc->facts.max_msix_vectors, mrioc->facts.max_perids); in mpi3mr_process_factsdata()
2931 mrioc->facts.sge_mod_mask, mrioc->facts.sge_mod_value, in mpi3mr_process_factsdata()
2932 mrioc->facts.sge_mod_shift); in mpi3mr_process_factsdata()
2934 mrioc->facts.dma_mask, (facts_flags & in mpi3mr_process_factsdata()
2935 MPI3_IOCFACTS_FLAGS_INITIAL_PORT_ENABLE_MASK), mrioc->facts.max_data_length); in mpi3mr_process_factsdata()
2938 mrioc->facts.max_dev_per_tg, mrioc->facts.max_io_throttle_group); in mpi3mr_process_factsdata()
2941 mrioc->facts.io_throttle_data_length * 4, in mpi3mr_process_factsdata()
2942 mrioc->facts.io_throttle_high, mrioc->facts.io_throttle_low); in mpi3mr_process_factsdata()
2946 * mpi3mr_alloc_reply_sense_bufs - Send IOC Init
2952 * Return: 0 on success, non-zero on failures.
2959 if (mrioc->init_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2962 mrioc->init_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2963 if (!mrioc->init_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2966 mrioc->bsg_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2967 if (!mrioc->bsg_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2970 mrioc->transport_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2971 if (!mrioc->transport_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2975 mrioc->dev_rmhs_cmds[i].reply = kzalloc(mrioc->reply_sz, in mpi3mr_alloc_reply_sense_bufs()
2977 if (!mrioc->dev_rmhs_cmds[i].reply) in mpi3mr_alloc_reply_sense_bufs()
2982 mrioc->evtack_cmds[i].reply = kzalloc(mrioc->reply_sz, in mpi3mr_alloc_reply_sense_bufs()
2984 if (!mrioc->evtack_cmds[i].reply) in mpi3mr_alloc_reply_sense_bufs()
2988 mrioc->host_tm_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2989 if (!mrioc->host_tm_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2992 mrioc->pel_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2993 if (!mrioc->pel_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
2996 mrioc->pel_abort_cmd.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
2997 if (!mrioc->pel_abort_cmd.reply) in mpi3mr_alloc_reply_sense_bufs()
3000 mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle; in mpi3mr_alloc_reply_sense_bufs()
3001 mrioc->removepend_bitmap = bitmap_zalloc(mrioc->dev_handle_bitmap_bits, in mpi3mr_alloc_reply_sense_bufs()
3003 if (!mrioc->removepend_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3006 mrioc->devrem_bitmap = bitmap_zalloc(MPI3MR_NUM_DEVRMCMD, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3007 if (!mrioc->devrem_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3010 mrioc->evtack_cmds_bitmap = bitmap_zalloc(MPI3MR_NUM_EVTACKCMD, in mpi3mr_alloc_reply_sense_bufs()
3012 if (!mrioc->evtack_cmds_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3015 mrioc->num_reply_bufs = mrioc->facts.max_reqs + MPI3MR_NUM_EVT_REPLIES; in mpi3mr_alloc_reply_sense_bufs()
3016 mrioc->reply_free_qsz = mrioc->num_reply_bufs + 1; in mpi3mr_alloc_reply_sense_bufs()
3017 mrioc->num_sense_bufs = mrioc->facts.max_reqs / MPI3MR_SENSEBUF_FACTOR; in mpi3mr_alloc_reply_sense_bufs()
3018 mrioc->sense_buf_q_sz = mrioc->num_sense_bufs + 1; in mpi3mr_alloc_reply_sense_bufs()
3021 sz = mrioc->num_reply_bufs * mrioc->reply_sz; in mpi3mr_alloc_reply_sense_bufs()
3022 mrioc->reply_buf_pool = dma_pool_create("reply_buf pool", in mpi3mr_alloc_reply_sense_bufs()
3023 &mrioc->pdev->dev, sz, 16, 0); in mpi3mr_alloc_reply_sense_bufs()
3024 if (!mrioc->reply_buf_pool) { in mpi3mr_alloc_reply_sense_bufs()
3029 mrioc->reply_buf = dma_pool_zalloc(mrioc->reply_buf_pool, GFP_KERNEL, in mpi3mr_alloc_reply_sense_bufs()
3030 &mrioc->reply_buf_dma); in mpi3mr_alloc_reply_sense_bufs()
3031 if (!mrioc->reply_buf) in mpi3mr_alloc_reply_sense_bufs()
3034 mrioc->reply_buf_dma_max_address = mrioc->reply_buf_dma + sz; in mpi3mr_alloc_reply_sense_bufs()
3037 sz = mrioc->reply_free_qsz * 8; in mpi3mr_alloc_reply_sense_bufs()
3038 mrioc->reply_free_q_pool = dma_pool_create("reply_free_q pool", in mpi3mr_alloc_reply_sense_bufs()
3039 &mrioc->pdev->dev, sz, 8, 0); in mpi3mr_alloc_reply_sense_bufs()
3040 if (!mrioc->reply_free_q_pool) { in mpi3mr_alloc_reply_sense_bufs()
3044 mrioc->reply_free_q = dma_pool_zalloc(mrioc->reply_free_q_pool, in mpi3mr_alloc_reply_sense_bufs()
3045 GFP_KERNEL, &mrioc->reply_free_q_dma); in mpi3mr_alloc_reply_sense_bufs()
3046 if (!mrioc->reply_free_q) in mpi3mr_alloc_reply_sense_bufs()
3050 sz = mrioc->num_sense_bufs * MPI3MR_SENSE_BUF_SZ; in mpi3mr_alloc_reply_sense_bufs()
3051 mrioc->sense_buf_pool = dma_pool_create("sense_buf pool", in mpi3mr_alloc_reply_sense_bufs()
3052 &mrioc->pdev->dev, sz, 4, 0); in mpi3mr_alloc_reply_sense_bufs()
3053 if (!mrioc->sense_buf_pool) { in mpi3mr_alloc_reply_sense_bufs()
3057 mrioc->sense_buf = dma_pool_zalloc(mrioc->sense_buf_pool, GFP_KERNEL, in mpi3mr_alloc_reply_sense_bufs()
3058 &mrioc->sense_buf_dma); in mpi3mr_alloc_reply_sense_bufs()
3059 if (!mrioc->sense_buf) in mpi3mr_alloc_reply_sense_bufs()
3063 sz = mrioc->sense_buf_q_sz * 8; in mpi3mr_alloc_reply_sense_bufs()
3064 mrioc->sense_buf_q_pool = dma_pool_create("sense_buf_q pool", in mpi3mr_alloc_reply_sense_bufs()
3065 &mrioc->pdev->dev, sz, 8, 0); in mpi3mr_alloc_reply_sense_bufs()
3066 if (!mrioc->sense_buf_q_pool) { in mpi3mr_alloc_reply_sense_bufs()
3070 mrioc->sense_buf_q = dma_pool_zalloc(mrioc->sense_buf_q_pool, in mpi3mr_alloc_reply_sense_bufs()
3071 GFP_KERNEL, &mrioc->sense_buf_q_dma); in mpi3mr_alloc_reply_sense_bufs()
3072 if (!mrioc->sense_buf_q) in mpi3mr_alloc_reply_sense_bufs()
3078 retval = -1; in mpi3mr_alloc_reply_sense_bufs()
3083 * mpimr_initialize_reply_sbuf_queues - initialize reply sense
3097 sz = mrioc->num_reply_bufs * mrioc->reply_sz; in mpimr_initialize_reply_sbuf_queues()
3100 mrioc->reply_buf, mrioc->num_reply_bufs, mrioc->reply_sz, in mpimr_initialize_reply_sbuf_queues()
3101 (sz / 1024), (unsigned long long)mrioc->reply_buf_dma); in mpimr_initialize_reply_sbuf_queues()
3102 sz = mrioc->reply_free_qsz * 8; in mpimr_initialize_reply_sbuf_queues()
3105 mrioc->reply_free_q, mrioc->reply_free_qsz, 8, (sz / 1024), in mpimr_initialize_reply_sbuf_queues()
3106 (unsigned long long)mrioc->reply_free_q_dma); in mpimr_initialize_reply_sbuf_queues()
3107 sz = mrioc->num_sense_bufs * MPI3MR_SENSE_BUF_SZ; in mpimr_initialize_reply_sbuf_queues()
3110 mrioc->sense_buf, mrioc->num_sense_bufs, MPI3MR_SENSE_BUF_SZ, in mpimr_initialize_reply_sbuf_queues()
3111 (sz / 1024), (unsigned long long)mrioc->sense_buf_dma); in mpimr_initialize_reply_sbuf_queues()
3112 sz = mrioc->sense_buf_q_sz * 8; in mpimr_initialize_reply_sbuf_queues()
3115 mrioc->sense_buf_q, mrioc->sense_buf_q_sz, 8, (sz / 1024), in mpimr_initialize_reply_sbuf_queues()
3116 (unsigned long long)mrioc->sense_buf_q_dma); in mpimr_initialize_reply_sbuf_queues()
3119 for (i = 0, phy_addr = mrioc->reply_buf_dma; in mpimr_initialize_reply_sbuf_queues()
3120 i < mrioc->num_reply_bufs; i++, phy_addr += mrioc->reply_sz) in mpimr_initialize_reply_sbuf_queues()
3121 mrioc->reply_free_q[i] = cpu_to_le64(phy_addr); in mpimr_initialize_reply_sbuf_queues()
3122 mrioc->reply_free_q[i] = cpu_to_le64(0); in mpimr_initialize_reply_sbuf_queues()
3125 for (i = 0, phy_addr = mrioc->sense_buf_dma; in mpimr_initialize_reply_sbuf_queues()
3126 i < mrioc->num_sense_bufs; i++, phy_addr += MPI3MR_SENSE_BUF_SZ) in mpimr_initialize_reply_sbuf_queues()
3127 mrioc->sense_buf_q[i] = cpu_to_le64(phy_addr); in mpimr_initialize_reply_sbuf_queues()
3128 mrioc->sense_buf_q[i] = cpu_to_le64(0); in mpimr_initialize_reply_sbuf_queues()
3132 * mpi3mr_issue_iocinit - Send IOC Init
3138 * Return: 0 on success, non-zero on failures.
3149 drv_info = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_issue_iocinit()
3152 retval = -1; in mpi3mr_issue_iocinit()
3157 drv_info->information_length = cpu_to_le32(data_len); in mpi3mr_issue_iocinit()
3158 strscpy(drv_info->driver_signature, "Broadcom", sizeof(drv_info->driver_signature)); in mpi3mr_issue_iocinit()
3159 strscpy(drv_info->os_name, utsname()->sysname, sizeof(drv_info->os_name)); in mpi3mr_issue_iocinit()
3160 strscpy(drv_info->os_version, utsname()->release, sizeof(drv_info->os_version)); in mpi3mr_issue_iocinit()
3161 strscpy(drv_info->driver_name, MPI3MR_DRIVER_NAME, sizeof(drv_info->driver_name)); in mpi3mr_issue_iocinit()
3162 strscpy(drv_info->driver_version, MPI3MR_DRIVER_VERSION, sizeof(drv_info->driver_version)); in mpi3mr_issue_iocinit()
3163 strscpy(drv_info->driver_release_date, MPI3MR_DRIVER_RELDATE, in mpi3mr_issue_iocinit()
3164 sizeof(drv_info->driver_release_date)); in mpi3mr_issue_iocinit()
3165 drv_info->driver_capabilities = 0; in mpi3mr_issue_iocinit()
3166 memcpy((u8 *)&mrioc->driver_info, (u8 *)drv_info, in mpi3mr_issue_iocinit()
3167 sizeof(mrioc->driver_info)); in mpi3mr_issue_iocinit()
3170 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3171 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_iocinit()
3172 retval = -1; in mpi3mr_issue_iocinit()
3174 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3177 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_iocinit()
3178 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_iocinit()
3179 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_iocinit()
3187 iocinit_req.reply_free_queue_depth = cpu_to_le16(mrioc->reply_free_qsz); in mpi3mr_issue_iocinit()
3189 cpu_to_le64(mrioc->reply_free_q_dma); in mpi3mr_issue_iocinit()
3192 cpu_to_le16(mrioc->sense_buf_q_sz); in mpi3mr_issue_iocinit()
3194 cpu_to_le64(mrioc->sense_buf_q_dma); in mpi3mr_issue_iocinit()
3200 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_iocinit()
3207 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_iocinit()
3209 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_iocinit()
3213 retval = -1; in mpi3mr_issue_iocinit()
3216 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_iocinit()
3220 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_iocinit()
3221 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_iocinit()
3222 retval = -1; in mpi3mr_issue_iocinit()
3226 mrioc->reply_free_queue_host_index = mrioc->num_reply_bufs; in mpi3mr_issue_iocinit()
3227 writel(mrioc->reply_free_queue_host_index, in mpi3mr_issue_iocinit()
3228 &mrioc->sysif_regs->reply_free_host_index); in mpi3mr_issue_iocinit()
3230 mrioc->sbq_host_index = mrioc->num_sense_bufs; in mpi3mr_issue_iocinit()
3231 writel(mrioc->sbq_host_index, in mpi3mr_issue_iocinit()
3232 &mrioc->sysif_regs->sense_buffer_free_host_index); in mpi3mr_issue_iocinit()
3234 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_iocinit()
3235 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3239 dma_free_coherent(&mrioc->pdev->dev, data_len, drv_info, in mpi3mr_issue_iocinit()
3246 * mpi3mr_unmask_events - Unmask events in event mask bitmap
3253 * Return: 0 on success, non-zero on failures.
3266 mrioc->event_masks[word] &= ~desired_event; in mpi3mr_unmask_events()
3270 * mpi3mr_issue_event_notification - Send event notification
3276 * Return: 0 on success, non-zero on failures.
3285 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3286 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_event_notification()
3287 retval = -1; in mpi3mr_issue_event_notification()
3289 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3292 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_event_notification()
3293 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_event_notification()
3294 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_event_notification()
3299 cpu_to_le32(mrioc->event_masks[i]); in mpi3mr_issue_event_notification()
3300 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_event_notification()
3307 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_event_notification()
3309 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_event_notification()
3313 retval = -1; in mpi3mr_issue_event_notification()
3316 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_event_notification()
3320 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_event_notification()
3321 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_event_notification()
3322 retval = -1; in mpi3mr_issue_event_notification()
3327 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_event_notification()
3328 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3334 * mpi3mr_process_event_ack - Process event acknowledgment
3342 * Return: 0 on success, non-zero on failures.
3351 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3352 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_process_event_ack()
3353 retval = -1; in mpi3mr_process_event_ack()
3355 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3358 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_process_event_ack()
3359 mrioc->init_cmds.is_waiting = 1; in mpi3mr_process_event_ack()
3360 mrioc->init_cmds.callback = NULL; in mpi3mr_process_event_ack()
3366 init_completion(&mrioc->init_cmds.done); in mpi3mr_process_event_ack()
3373 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_process_event_ack()
3375 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_process_event_ack()
3377 if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET)) in mpi3mr_process_event_ack()
3380 retval = -1; in mpi3mr_process_event_ack()
3383 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_process_event_ack()
3387 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_process_event_ack()
3388 mrioc->init_cmds.ioc_loginfo); in mpi3mr_process_event_ack()
3389 retval = -1; in mpi3mr_process_event_ack()
3394 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_process_event_ack()
3395 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3401 * mpi3mr_alloc_chain_bufs - Allocate chain buffers
3408 * Return: 0 on success, non-zero on failure
3416 if (mrioc->chain_sgl_list) in mpi3mr_alloc_chain_bufs()
3419 num_chains = mrioc->max_host_ios / MPI3MR_CHAINBUF_FACTOR; in mpi3mr_alloc_chain_bufs()
3427 mrioc->chain_buf_count = num_chains; in mpi3mr_alloc_chain_bufs()
3429 mrioc->chain_sgl_list = kzalloc(sz, GFP_KERNEL); in mpi3mr_alloc_chain_bufs()
3430 if (!mrioc->chain_sgl_list) in mpi3mr_alloc_chain_bufs()
3433 if (mrioc->max_sgl_entries > (mrioc->facts.max_data_length / in mpi3mr_alloc_chain_bufs()
3435 mrioc->max_sgl_entries = mrioc->facts.max_data_length / in mpi3mr_alloc_chain_bufs()
3437 sz = mrioc->max_sgl_entries * sizeof(struct mpi3_sge_common); in mpi3mr_alloc_chain_bufs()
3439 mrioc->max_sgl_entries, sz/1024); in mpi3mr_alloc_chain_bufs()
3441 mrioc->chain_buf_pool = dma_pool_create("chain_buf pool", in mpi3mr_alloc_chain_bufs()
3442 &mrioc->pdev->dev, sz, 16, 0); in mpi3mr_alloc_chain_bufs()
3443 if (!mrioc->chain_buf_pool) { in mpi3mr_alloc_chain_bufs()
3449 mrioc->chain_sgl_list[i].addr = in mpi3mr_alloc_chain_bufs()
3450 dma_pool_zalloc(mrioc->chain_buf_pool, GFP_KERNEL, in mpi3mr_alloc_chain_bufs()
3451 &mrioc->chain_sgl_list[i].dma_addr); in mpi3mr_alloc_chain_bufs()
3453 if (!mrioc->chain_sgl_list[i].addr) in mpi3mr_alloc_chain_bufs()
3456 mrioc->chain_bitmap = bitmap_zalloc(num_chains, GFP_KERNEL); in mpi3mr_alloc_chain_bufs()
3457 if (!mrioc->chain_bitmap) in mpi3mr_alloc_chain_bufs()
3461 retval = -1; in mpi3mr_alloc_chain_bufs()
3466 * mpi3mr_port_enable_complete - Mark port enable complete
3478 drv_cmd->callback = NULL; in mpi3mr_port_enable_complete()
3479 mrioc->scan_started = 0; in mpi3mr_port_enable_complete()
3480 if (drv_cmd->state & MPI3MR_CMD_RESET) in mpi3mr_port_enable_complete()
3481 mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR; in mpi3mr_port_enable_complete()
3483 mrioc->scan_failed = drv_cmd->ioc_status; in mpi3mr_port_enable_complete()
3484 drv_cmd->state = MPI3MR_CMD_NOTUSED; in mpi3mr_port_enable_complete()
3488 * mpi3mr_issue_port_enable - Issue Port Enable
3496 * Return: 0 on success, non-zero on failures.
3505 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3506 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_port_enable()
3507 retval = -1; in mpi3mr_issue_port_enable()
3509 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3512 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_port_enable()
3514 mrioc->init_cmds.is_waiting = 0; in mpi3mr_issue_port_enable()
3515 mrioc->init_cmds.callback = mpi3mr_port_enable_complete; in mpi3mr_issue_port_enable()
3517 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_port_enable()
3518 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_port_enable()
3519 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_port_enable()
3530 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3534 wait_for_completion_timeout(&mrioc->init_cmds.done, (pe_timeout * HZ)); in mpi3mr_issue_port_enable()
3535 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_port_enable()
3537 retval = -1; in mpi3mr_issue_port_enable()
3541 mpi3mr_port_enable_complete(mrioc, &mrioc->init_cmds); in mpi3mr_issue_port_enable()
3544 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_port_enable()
3545 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3570 * mpi3mr_print_ioc_info - Display controller information
3585 struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver; in mpi3mr_print_ioc_info()
3587 switch (mrioc->facts.personality) { in mpi3mr_print_ioc_info()
3602 fwver->gen_major, fwver->gen_minor, fwver->ph_major, in mpi3mr_print_ioc_info()
3603 fwver->ph_minor, fwver->cust_id, fwver->build_num); in mpi3mr_print_ioc_info()
3606 if (mrioc->facts.protocol_flags & in mpi3mr_print_ioc_info()
3609 sizeof(protocol) - bytes_written, "%s%s", in mpi3mr_print_ioc_info()
3617 if (mrioc->facts.protocol_flags & in mpi3mr_print_ioc_info()
3620 sizeof(capabilities) - bytes_written, "%s%s", in mpi3mr_print_ioc_info()
3631 * mpi3mr_cleanup_resources - Free PCI resources
3636 * Return: 0 on success and non-zero on failure.
3640 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_cleanup_resources()
3644 if (mrioc->sysif_regs) { in mpi3mr_cleanup_resources()
3645 iounmap((void __iomem *)mrioc->sysif_regs); in mpi3mr_cleanup_resources()
3646 mrioc->sysif_regs = NULL; in mpi3mr_cleanup_resources()
3650 if (mrioc->bars) in mpi3mr_cleanup_resources()
3651 pci_release_selected_regions(pdev, mrioc->bars); in mpi3mr_cleanup_resources()
3657 * mpi3mr_setup_resources - Enable PCI resources
3660 * Enable PCI device memory, MSI-x registers and set DMA mask.
3662 * Return: 0 on success and non-zero on failure.
3666 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_setup_resources()
3670 u64 dma_mask = mrioc->dma_mask ? mrioc->dma_mask : in mpi3mr_setup_resources()
3675 retval = -ENODEV; in mpi3mr_setup_resources()
3681 ioc_err(mrioc, "Unable to find MSI-X Capabilities\n"); in mpi3mr_setup_resources()
3682 retval = -ENODEV; in mpi3mr_setup_resources()
3685 mrioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); in mpi3mr_setup_resources()
3687 if (pci_request_selected_regions(pdev, mrioc->bars, in mpi3mr_setup_resources()
3688 mrioc->driver_name)) { in mpi3mr_setup_resources()
3690 retval = -ENODEV; in mpi3mr_setup_resources()
3696 mrioc->sysif_regs_phys = pci_resource_start(pdev, i); in mpi3mr_setup_resources()
3698 mrioc->sysif_regs = in mpi3mr_setup_resources()
3699 ioremap(mrioc->sysif_regs_phys, memap_sz); in mpi3mr_setup_resources()
3706 retval = dma_set_mask_and_coherent(&pdev->dev, dma_mask); in mpi3mr_setup_resources()
3711 retval = dma_set_mask_and_coherent(&pdev->dev, in mpi3mr_setup_resources()
3715 mrioc->dma_mask = 0; in mpi3mr_setup_resources()
3720 mrioc->dma_mask = dma_mask; in mpi3mr_setup_resources()
3722 if (!mrioc->sysif_regs) { in mpi3mr_setup_resources()
3725 retval = -EINVAL; in mpi3mr_setup_resources()
3730 mrioc->msix_count = (message_control & 0x3FF) + 1; in mpi3mr_setup_resources()
3734 pci_set_drvdata(pdev, mrioc->shost); in mpi3mr_setup_resources()
3739 (unsigned long long)mrioc->sysif_regs_phys, in mpi3mr_setup_resources()
3740 mrioc->sysif_regs, memap_sz); in mpi3mr_setup_resources()
3741 ioc_info(mrioc, "Number of MSI-X vectors found in capabilities: (%d)\n", in mpi3mr_setup_resources()
3742 mrioc->msix_count); in mpi3mr_setup_resources()
3745 mrioc->requested_poll_qcount = min_t(int, poll_queues, in mpi3mr_setup_resources()
3746 mrioc->msix_count - 2); in mpi3mr_setup_resources()
3755 * mpi3mr_enable_events - Enable required events
3762 * Return: 0 on success and non-zero on failure.
3770 mrioc->event_masks[i] = -1; in mpi3mr_enable_events()
3795 * mpi3mr_init_ioc - Initialize the controller
3801 * registers, create admin and operational reply queue pairs,
3807 * Return: 0 on success and non-zero on failure.
3838 mrioc->max_host_ios = mrioc->facts.max_reqs - MPI3MR_INTERNAL_CMDS_RESVD; in mpi3mr_init_ioc()
3839 mrioc->shost->max_sectors = mrioc->facts.max_data_length / 512; in mpi3mr_init_ioc()
3840 mrioc->num_io_throttle_group = mrioc->facts.max_io_throttle_group; in mpi3mr_init_ioc()
3841 atomic_set(&mrioc->pend_large_data_sz, 0); in mpi3mr_init_ioc()
3844 mrioc->max_host_ios = min_t(int, mrioc->max_host_ios, in mpi3mr_init_ioc()
3847 if (!(mrioc->facts.ioc_capabilities & in mpi3mr_init_ioc()
3849 mrioc->sas_transport_enabled = 1; in mpi3mr_init_ioc()
3850 mrioc->scsi_device_channel = 1; in mpi3mr_init_ioc()
3851 mrioc->shost->max_channel = 1; in mpi3mr_init_ioc()
3852 mrioc->shost->transportt = mpi3mr_transport_template; in mpi3mr_init_ioc()
3855 mrioc->reply_sz = mrioc->facts.reply_sz; in mpi3mr_init_ioc()
3866 if (!mrioc->cfg_page) { in mpi3mr_init_ioc()
3868 mrioc->cfg_page_sz = MPI3MR_DEFAULT_CFG_PAGE_SZ; in mpi3mr_init_ioc()
3869 mrioc->cfg_page = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_init_ioc()
3870 mrioc->cfg_page_sz, &mrioc->cfg_page_dma, GFP_KERNEL); in mpi3mr_init_ioc()
3871 if (!mrioc->cfg_page) { in mpi3mr_init_ioc()
3872 retval = -1; in mpi3mr_init_ioc()
3877 if (!mrioc->init_cmds.reply) { in mpi3mr_init_ioc()
3887 if (!mrioc->chain_sgl_list) { in mpi3mr_init_ioc()
3911 ioc_err(mrioc, "Failed to re-setup ISR, error %d\n", in mpi3mr_init_ioc()
3923 if (!mrioc->pel_seqnum_virt) { in mpi3mr_init_ioc()
3925 mrioc->pel_seqnum_sz = sizeof(struct mpi3_pel_seq); in mpi3mr_init_ioc()
3926 mrioc->pel_seqnum_virt = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_init_ioc()
3927 mrioc->pel_seqnum_sz, &mrioc->pel_seqnum_dma, in mpi3mr_init_ioc()
3929 if (!mrioc->pel_seqnum_virt) { in mpi3mr_init_ioc()
3930 retval = -ENOMEM; in mpi3mr_init_ioc()
3935 if (!mrioc->throttle_groups && mrioc->num_io_throttle_group) { in mpi3mr_init_ioc()
3938 mrioc->throttle_groups = kcalloc(mrioc->num_io_throttle_group, sz, GFP_KERNEL); in mpi3mr_init_ioc()
3939 if (!mrioc->throttle_groups) { in mpi3mr_init_ioc()
3940 retval = -1; in mpi3mr_init_ioc()
3962 retval = -1; in mpi3mr_init_ioc()
3967 mrioc->unrecoverable = 1; in mpi3mr_init_ioc()
3972 * mpi3mr_reinit_ioc - Re-Initialize the controller
3976 * This the controller re-initialization routine, executed from
3978 * operational reply queue pairs, allocate required memory for
3983 * Return: 0 on success and non-zero on failure.
4047 ioc_err(mrioc, "failed to re-setup ISR\n"); in mpi3mr_reinit_ioc()
4052 dprint_reset(mrioc, "creating operational queue pairs\n"); in mpi3mr_reinit_ioc()
4055 ioc_err(mrioc, "failed to create operational queue pairs\n"); in mpi3mr_reinit_ioc()
4059 if (!mrioc->pel_seqnum_virt) { in mpi3mr_reinit_ioc()
4061 mrioc->pel_seqnum_sz = sizeof(struct mpi3_pel_seq); in mpi3mr_reinit_ioc()
4062 mrioc->pel_seqnum_virt = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_reinit_ioc()
4063 mrioc->pel_seqnum_sz, &mrioc->pel_seqnum_dma, in mpi3mr_reinit_ioc()
4065 if (!mrioc->pel_seqnum_virt) { in mpi3mr_reinit_ioc()
4066 retval = -ENOMEM; in mpi3mr_reinit_ioc()
4071 if (mrioc->shost->nr_hw_queues > mrioc->num_op_reply_q) { in mpi3mr_reinit_ioc()
4073 "cannot create minimum number of operational queues expected:%d created:%d\n", in mpi3mr_reinit_ioc()
4074 mrioc->shost->nr_hw_queues, mrioc->num_op_reply_q); in mpi3mr_reinit_ioc()
4075 retval = -1; in mpi3mr_reinit_ioc()
4086 mrioc->device_refresh_on = 1; in mpi3mr_reinit_ioc()
4097 if (mrioc->init_cmds.state == MPI3MR_CMD_NOTUSED) in mpi3mr_reinit_ioc()
4099 if (!pci_device_is_present(mrioc->pdev)) in mpi3mr_reinit_ioc()
4100 mrioc->unrecoverable = 1; in mpi3mr_reinit_ioc()
4101 if (mrioc->unrecoverable) { in mpi3mr_reinit_ioc()
4102 retval = -1; in mpi3mr_reinit_ioc()
4105 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_reinit_ioc()
4109 mrioc->init_cmds.is_waiting = 0; in mpi3mr_reinit_ioc()
4110 mrioc->init_cmds.callback = NULL; in mpi3mr_reinit_ioc()
4111 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_reinit_ioc()
4114 } while (--pe_timeout); in mpi3mr_reinit_ioc()
4120 mrioc->init_cmds.is_waiting = 0; in mpi3mr_reinit_ioc()
4121 mrioc->init_cmds.callback = NULL; in mpi3mr_reinit_ioc()
4122 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_reinit_ioc()
4124 } else if (mrioc->scan_failed) { in mpi3mr_reinit_ioc()
4127 mrioc->scan_failed); in mpi3mr_reinit_ioc()
4132 (is_resume)?"resume":"re-initialization"); in mpi3mr_reinit_ioc()
4138 (is_resume)?"resume":"re-initialization", retry); in mpi3mr_reinit_ioc()
4142 retval = -1; in mpi3mr_reinit_ioc()
4145 (is_resume)?"resume":"re-initialization"); in mpi3mr_reinit_ioc()
4148 mrioc->unrecoverable = 1; in mpi3mr_reinit_ioc()
4153 * mpi3mr_memset_op_reply_q_buffers - memset the operational reply queue's
4156 * @qidx: Operational reply queue index
4162 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_memset_op_reply_q_buffers()
4166 if (!op_reply_q->q_segments) in mpi3mr_memset_op_reply_q_buffers()
4169 size = op_reply_q->segment_qd * mrioc->op_reply_desc_sz; in mpi3mr_memset_op_reply_q_buffers()
4170 segments = op_reply_q->q_segments; in mpi3mr_memset_op_reply_q_buffers()
4171 for (i = 0; i < op_reply_q->num_segments; i++) in mpi3mr_memset_op_reply_q_buffers()
4176 * mpi3mr_memset_op_req_q_buffers - memset the operational request queue's
4179 * @qidx: Operational request queue index
4185 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + qidx; in mpi3mr_memset_op_req_q_buffers()
4189 if (!op_req_q->q_segments) in mpi3mr_memset_op_req_q_buffers()
4192 size = op_req_q->segment_qd * mrioc->facts.op_req_sz; in mpi3mr_memset_op_req_q_buffers()
4193 segments = op_req_q->q_segments; in mpi3mr_memset_op_req_q_buffers()
4194 for (i = 0; i < op_req_q->num_segments; i++) in mpi3mr_memset_op_req_q_buffers()
4199 * mpi3mr_memset_buffers - memset memory for a controller
4213 mrioc->change_count = 0; in mpi3mr_memset_buffers()
4214 mrioc->active_poll_qcount = 0; in mpi3mr_memset_buffers()
4215 mrioc->default_qcount = 0; in mpi3mr_memset_buffers()
4216 if (mrioc->admin_req_base) in mpi3mr_memset_buffers()
4217 memset(mrioc->admin_req_base, 0, mrioc->admin_req_q_sz); in mpi3mr_memset_buffers()
4218 if (mrioc->admin_reply_base) in mpi3mr_memset_buffers()
4219 memset(mrioc->admin_reply_base, 0, mrioc->admin_reply_q_sz); in mpi3mr_memset_buffers()
4220 atomic_set(&mrioc->admin_reply_q_in_use, 0); in mpi3mr_memset_buffers()
4222 if (mrioc->init_cmds.reply) { in mpi3mr_memset_buffers()
4223 memset(mrioc->init_cmds.reply, 0, sizeof(*mrioc->init_cmds.reply)); in mpi3mr_memset_buffers()
4224 memset(mrioc->bsg_cmds.reply, 0, in mpi3mr_memset_buffers()
4225 sizeof(*mrioc->bsg_cmds.reply)); in mpi3mr_memset_buffers()
4226 memset(mrioc->host_tm_cmds.reply, 0, in mpi3mr_memset_buffers()
4227 sizeof(*mrioc->host_tm_cmds.reply)); in mpi3mr_memset_buffers()
4228 memset(mrioc->pel_cmds.reply, 0, in mpi3mr_memset_buffers()
4229 sizeof(*mrioc->pel_cmds.reply)); in mpi3mr_memset_buffers()
4230 memset(mrioc->pel_abort_cmd.reply, 0, in mpi3mr_memset_buffers()
4231 sizeof(*mrioc->pel_abort_cmd.reply)); in mpi3mr_memset_buffers()
4232 memset(mrioc->transport_cmds.reply, 0, in mpi3mr_memset_buffers()
4233 sizeof(*mrioc->transport_cmds.reply)); in mpi3mr_memset_buffers()
4235 memset(mrioc->dev_rmhs_cmds[i].reply, 0, in mpi3mr_memset_buffers()
4236 sizeof(*mrioc->dev_rmhs_cmds[i].reply)); in mpi3mr_memset_buffers()
4238 memset(mrioc->evtack_cmds[i].reply, 0, in mpi3mr_memset_buffers()
4239 sizeof(*mrioc->evtack_cmds[i].reply)); in mpi3mr_memset_buffers()
4240 bitmap_clear(mrioc->removepend_bitmap, 0, in mpi3mr_memset_buffers()
4241 mrioc->dev_handle_bitmap_bits); in mpi3mr_memset_buffers()
4242 bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD); in mpi3mr_memset_buffers()
4243 bitmap_clear(mrioc->evtack_cmds_bitmap, 0, in mpi3mr_memset_buffers()
4247 for (i = 0; i < mrioc->num_queues; i++) { in mpi3mr_memset_buffers()
4248 mrioc->op_reply_qinfo[i].qid = 0; in mpi3mr_memset_buffers()
4249 mrioc->op_reply_qinfo[i].ci = 0; in mpi3mr_memset_buffers()
4250 mrioc->op_reply_qinfo[i].num_replies = 0; in mpi3mr_memset_buffers()
4251 mrioc->op_reply_qinfo[i].ephase = 0; in mpi3mr_memset_buffers()
4252 atomic_set(&mrioc->op_reply_qinfo[i].pend_ios, 0); in mpi3mr_memset_buffers()
4253 atomic_set(&mrioc->op_reply_qinfo[i].in_use, 0); in mpi3mr_memset_buffers()
4256 mrioc->req_qinfo[i].ci = 0; in mpi3mr_memset_buffers()
4257 mrioc->req_qinfo[i].pi = 0; in mpi3mr_memset_buffers()
4258 mrioc->req_qinfo[i].num_requests = 0; in mpi3mr_memset_buffers()
4259 mrioc->req_qinfo[i].qid = 0; in mpi3mr_memset_buffers()
4260 mrioc->req_qinfo[i].reply_qid = 0; in mpi3mr_memset_buffers()
4261 spin_lock_init(&mrioc->req_qinfo[i].q_lock); in mpi3mr_memset_buffers()
4265 atomic_set(&mrioc->pend_large_data_sz, 0); in mpi3mr_memset_buffers()
4266 if (mrioc->throttle_groups) { in mpi3mr_memset_buffers()
4267 tg = mrioc->throttle_groups; in mpi3mr_memset_buffers()
4268 for (i = 0; i < mrioc->num_io_throttle_group; i++, tg++) { in mpi3mr_memset_buffers()
4269 tg->id = 0; in mpi3mr_memset_buffers()
4270 tg->fw_qd = 0; in mpi3mr_memset_buffers()
4271 tg->modified_qd = 0; in mpi3mr_memset_buffers()
4272 tg->io_divert = 0; in mpi3mr_memset_buffers()
4273 tg->need_qd_reduction = 0; in mpi3mr_memset_buffers()
4274 tg->high = 0; in mpi3mr_memset_buffers()
4275 tg->low = 0; in mpi3mr_memset_buffers()
4276 tg->qd_reduction = 0; in mpi3mr_memset_buffers()
4277 atomic_set(&tg->pend_large_data_sz, 0); in mpi3mr_memset_buffers()
4283 * mpi3mr_free_mem - Free memory allocated for a controller
4297 if (mrioc->sense_buf_pool) { in mpi3mr_free_mem()
4298 if (mrioc->sense_buf) in mpi3mr_free_mem()
4299 dma_pool_free(mrioc->sense_buf_pool, mrioc->sense_buf, in mpi3mr_free_mem()
4300 mrioc->sense_buf_dma); in mpi3mr_free_mem()
4301 dma_pool_destroy(mrioc->sense_buf_pool); in mpi3mr_free_mem()
4302 mrioc->sense_buf = NULL; in mpi3mr_free_mem()
4303 mrioc->sense_buf_pool = NULL; in mpi3mr_free_mem()
4305 if (mrioc->sense_buf_q_pool) { in mpi3mr_free_mem()
4306 if (mrioc->sense_buf_q) in mpi3mr_free_mem()
4307 dma_pool_free(mrioc->sense_buf_q_pool, in mpi3mr_free_mem()
4308 mrioc->sense_buf_q, mrioc->sense_buf_q_dma); in mpi3mr_free_mem()
4309 dma_pool_destroy(mrioc->sense_buf_q_pool); in mpi3mr_free_mem()
4310 mrioc->sense_buf_q = NULL; in mpi3mr_free_mem()
4311 mrioc->sense_buf_q_pool = NULL; in mpi3mr_free_mem()
4314 if (mrioc->reply_buf_pool) { in mpi3mr_free_mem()
4315 if (mrioc->reply_buf) in mpi3mr_free_mem()
4316 dma_pool_free(mrioc->reply_buf_pool, mrioc->reply_buf, in mpi3mr_free_mem()
4317 mrioc->reply_buf_dma); in mpi3mr_free_mem()
4318 dma_pool_destroy(mrioc->reply_buf_pool); in mpi3mr_free_mem()
4319 mrioc->reply_buf = NULL; in mpi3mr_free_mem()
4320 mrioc->reply_buf_pool = NULL; in mpi3mr_free_mem()
4322 if (mrioc->reply_free_q_pool) { in mpi3mr_free_mem()
4323 if (mrioc->reply_free_q) in mpi3mr_free_mem()
4324 dma_pool_free(mrioc->reply_free_q_pool, in mpi3mr_free_mem()
4325 mrioc->reply_free_q, mrioc->reply_free_q_dma); in mpi3mr_free_mem()
4326 dma_pool_destroy(mrioc->reply_free_q_pool); in mpi3mr_free_mem()
4327 mrioc->reply_free_q = NULL; in mpi3mr_free_mem()
4328 mrioc->reply_free_q_pool = NULL; in mpi3mr_free_mem()
4331 for (i = 0; i < mrioc->num_op_req_q; i++) in mpi3mr_free_mem()
4334 for (i = 0; i < mrioc->num_op_reply_q; i++) in mpi3mr_free_mem()
4337 for (i = 0; i < mrioc->intr_info_count; i++) { in mpi3mr_free_mem()
4338 intr_info = mrioc->intr_info + i; in mpi3mr_free_mem()
4339 intr_info->op_reply_q = NULL; in mpi3mr_free_mem()
4342 kfree(mrioc->req_qinfo); in mpi3mr_free_mem()
4343 mrioc->req_qinfo = NULL; in mpi3mr_free_mem()
4344 mrioc->num_op_req_q = 0; in mpi3mr_free_mem()
4346 kfree(mrioc->op_reply_qinfo); in mpi3mr_free_mem()
4347 mrioc->op_reply_qinfo = NULL; in mpi3mr_free_mem()
4348 mrioc->num_op_reply_q = 0; in mpi3mr_free_mem()
4350 kfree(mrioc->init_cmds.reply); in mpi3mr_free_mem()
4351 mrioc->init_cmds.reply = NULL; in mpi3mr_free_mem()
4353 kfree(mrioc->bsg_cmds.reply); in mpi3mr_free_mem()
4354 mrioc->bsg_cmds.reply = NULL; in mpi3mr_free_mem()
4356 kfree(mrioc->host_tm_cmds.reply); in mpi3mr_free_mem()
4357 mrioc->host_tm_cmds.reply = NULL; in mpi3mr_free_mem()
4359 kfree(mrioc->pel_cmds.reply); in mpi3mr_free_mem()
4360 mrioc->pel_cmds.reply = NULL; in mpi3mr_free_mem()
4362 kfree(mrioc->pel_abort_cmd.reply); in mpi3mr_free_mem()
4363 mrioc->pel_abort_cmd.reply = NULL; in mpi3mr_free_mem()
4366 kfree(mrioc->evtack_cmds[i].reply); in mpi3mr_free_mem()
4367 mrioc->evtack_cmds[i].reply = NULL; in mpi3mr_free_mem()
4370 bitmap_free(mrioc->removepend_bitmap); in mpi3mr_free_mem()
4371 mrioc->removepend_bitmap = NULL; in mpi3mr_free_mem()
4373 bitmap_free(mrioc->devrem_bitmap); in mpi3mr_free_mem()
4374 mrioc->devrem_bitmap = NULL; in mpi3mr_free_mem()
4376 bitmap_free(mrioc->evtack_cmds_bitmap); in mpi3mr_free_mem()
4377 mrioc->evtack_cmds_bitmap = NULL; in mpi3mr_free_mem()
4379 bitmap_free(mrioc->chain_bitmap); in mpi3mr_free_mem()
4380 mrioc->chain_bitmap = NULL; in mpi3mr_free_mem()
4382 kfree(mrioc->transport_cmds.reply); in mpi3mr_free_mem()
4383 mrioc->transport_cmds.reply = NULL; in mpi3mr_free_mem()
4386 kfree(mrioc->dev_rmhs_cmds[i].reply); in mpi3mr_free_mem()
4387 mrioc->dev_rmhs_cmds[i].reply = NULL; in mpi3mr_free_mem()
4390 if (mrioc->chain_buf_pool) { in mpi3mr_free_mem()
4391 for (i = 0; i < mrioc->chain_buf_count; i++) { in mpi3mr_free_mem()
4392 if (mrioc->chain_sgl_list[i].addr) { in mpi3mr_free_mem()
4393 dma_pool_free(mrioc->chain_buf_pool, in mpi3mr_free_mem()
4394 mrioc->chain_sgl_list[i].addr, in mpi3mr_free_mem()
4395 mrioc->chain_sgl_list[i].dma_addr); in mpi3mr_free_mem()
4396 mrioc->chain_sgl_list[i].addr = NULL; in mpi3mr_free_mem()
4399 dma_pool_destroy(mrioc->chain_buf_pool); in mpi3mr_free_mem()
4400 mrioc->chain_buf_pool = NULL; in mpi3mr_free_mem()
4403 kfree(mrioc->chain_sgl_list); in mpi3mr_free_mem()
4404 mrioc->chain_sgl_list = NULL; in mpi3mr_free_mem()
4406 if (mrioc->admin_reply_base) { in mpi3mr_free_mem()
4407 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_reply_q_sz, in mpi3mr_free_mem()
4408 mrioc->admin_reply_base, mrioc->admin_reply_dma); in mpi3mr_free_mem()
4409 mrioc->admin_reply_base = NULL; in mpi3mr_free_mem()
4411 if (mrioc->admin_req_base) { in mpi3mr_free_mem()
4412 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_req_q_sz, in mpi3mr_free_mem()
4413 mrioc->admin_req_base, mrioc->admin_req_dma); in mpi3mr_free_mem()
4414 mrioc->admin_req_base = NULL; in mpi3mr_free_mem()
4416 if (mrioc->cfg_page) { in mpi3mr_free_mem()
4417 dma_free_coherent(&mrioc->pdev->dev, mrioc->cfg_page_sz, in mpi3mr_free_mem()
4418 mrioc->cfg_page, mrioc->cfg_page_dma); in mpi3mr_free_mem()
4419 mrioc->cfg_page = NULL; in mpi3mr_free_mem()
4421 if (mrioc->pel_seqnum_virt) { in mpi3mr_free_mem()
4422 dma_free_coherent(&mrioc->pdev->dev, mrioc->pel_seqnum_sz, in mpi3mr_free_mem()
4423 mrioc->pel_seqnum_virt, mrioc->pel_seqnum_dma); in mpi3mr_free_mem()
4424 mrioc->pel_seqnum_virt = NULL; in mpi3mr_free_mem()
4427 kfree(mrioc->throttle_groups); in mpi3mr_free_mem()
4428 mrioc->throttle_groups = NULL; in mpi3mr_free_mem()
4430 kfree(mrioc->logdata_buf); in mpi3mr_free_mem()
4431 mrioc->logdata_buf = NULL; in mpi3mr_free_mem()
4436 * mpi3mr_issue_ioc_shutdown - shutdown controller
4451 if (mrioc->unrecoverable) { in mpi3mr_issue_ioc_shutdown()
4456 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4463 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4467 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4469 if (mrioc->facts.shutdown_timeout) in mpi3mr_issue_ioc_shutdown()
4470 timeout = mrioc->facts.shutdown_timeout * 10; in mpi3mr_issue_ioc_shutdown()
4473 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4480 } while (--timeout); in mpi3mr_issue_ioc_shutdown()
4482 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4483 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4499 * mpi3mr_cleanup_ioc - Cleanup controller
4516 if ((!mrioc->unrecoverable) && (!mrioc->reset_in_progress) && in mpi3mr_cleanup_ioc()
4529 * mpi3mr_drv_cmd_comp_reset - Flush a internal driver command
4541 if (cmdptr->state & MPI3MR_CMD_PENDING) { in mpi3mr_drv_cmd_comp_reset()
4542 cmdptr->state |= MPI3MR_CMD_RESET; in mpi3mr_drv_cmd_comp_reset()
4543 cmdptr->state &= ~MPI3MR_CMD_PENDING; in mpi3mr_drv_cmd_comp_reset()
4544 if (cmdptr->is_waiting) { in mpi3mr_drv_cmd_comp_reset()
4545 complete(&cmdptr->done); in mpi3mr_drv_cmd_comp_reset()
4546 cmdptr->is_waiting = 0; in mpi3mr_drv_cmd_comp_reset()
4547 } else if (cmdptr->callback) in mpi3mr_drv_cmd_comp_reset()
4548 cmdptr->callback(mrioc, cmdptr); in mpi3mr_drv_cmd_comp_reset()
4553 * mpi3mr_flush_drv_cmds - Flush internaldriver commands
4565 cmdptr = &mrioc->init_cmds; in mpi3mr_flush_drv_cmds()
4568 cmdptr = &mrioc->cfg_cmds; in mpi3mr_flush_drv_cmds()
4571 cmdptr = &mrioc->bsg_cmds; in mpi3mr_flush_drv_cmds()
4573 cmdptr = &mrioc->host_tm_cmds; in mpi3mr_flush_drv_cmds()
4577 cmdptr = &mrioc->dev_rmhs_cmds[i]; in mpi3mr_flush_drv_cmds()
4582 cmdptr = &mrioc->evtack_cmds[i]; in mpi3mr_flush_drv_cmds()
4586 cmdptr = &mrioc->pel_cmds; in mpi3mr_flush_drv_cmds()
4589 cmdptr = &mrioc->pel_abort_cmd; in mpi3mr_flush_drv_cmds()
4592 cmdptr = &mrioc->transport_cmds; in mpi3mr_flush_drv_cmds()
4597 * mpi3mr_pel_wait_post - Issue PEL Wait
4610 mrioc->pel_abort_requested = false; in mpi3mr_pel_wait_post()
4613 drv_cmd->state = MPI3MR_CMD_PENDING; in mpi3mr_pel_wait_post()
4614 drv_cmd->is_waiting = 0; in mpi3mr_pel_wait_post()
4615 drv_cmd->callback = mpi3mr_pel_wait_complete; in mpi3mr_pel_wait_post()
4616 drv_cmd->ioc_status = 0; in mpi3mr_pel_wait_post()
4617 drv_cmd->ioc_loginfo = 0; in mpi3mr_pel_wait_post()
4621 pel_wait.starting_sequence_number = cpu_to_le32(mrioc->pel_newest_seqnum); in mpi3mr_pel_wait_post()
4622 pel_wait.locale = cpu_to_le16(mrioc->pel_locale); in mpi3mr_pel_wait_post()
4623 pel_wait.class = cpu_to_le16(mrioc->pel_class); in mpi3mr_pel_wait_post()
4626 mrioc->pel_newest_seqnum, mrioc->pel_class, mrioc->pel_locale); in mpi3mr_pel_wait_post()
4631 drv_cmd->state = MPI3MR_CMD_NOTUSED; in mpi3mr_pel_wait_post()
4632 drv_cmd->callback = NULL; in mpi3mr_pel_wait_post()
4633 drv_cmd->retry_count = 0; in mpi3mr_pel_wait_post()
4634 mrioc->pel_enabled = false; in mpi3mr_pel_wait_post()
4639 * mpi3mr_pel_get_seqnum_post - Issue PEL Get Sequence number
4646 * Return: 0 on success, non-zero on failure.
4656 mrioc->pel_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_pel_get_seqnum_post()
4657 mrioc->pel_cmds.is_waiting = 0; in mpi3mr_pel_get_seqnum_post()
4658 mrioc->pel_cmds.ioc_status = 0; in mpi3mr_pel_get_seqnum_post()
4659 mrioc->pel_cmds.ioc_loginfo = 0; in mpi3mr_pel_get_seqnum_post()
4660 mrioc->pel_cmds.callback = mpi3mr_pel_get_seqnum_complete; in mpi3mr_pel_get_seqnum_post()
4665 mrioc->pel_seqnum_sz, mrioc->pel_seqnum_dma); in mpi3mr_pel_get_seqnum_post()
4671 drv_cmd->state = MPI3MR_CMD_NOTUSED; in mpi3mr_pel_get_seqnum_post()
4672 drv_cmd->callback = NULL; in mpi3mr_pel_get_seqnum_post()
4673 drv_cmd->retry_count = 0; in mpi3mr_pel_get_seqnum_post()
4675 mrioc->pel_enabled = false; in mpi3mr_pel_get_seqnum_post()
4682 * mpi3mr_pel_wait_complete - PELWait Completion callback
4701 if (drv_cmd->state & MPI3MR_CMD_RESET) in mpi3mr_pel_wait_complete()
4704 ioc_status = drv_cmd->ioc_status & MPI3_IOCSTATUS_STATUS_MASK; in mpi3mr_pel_wait_complete()
4707 __func__, ioc_status, drv_cmd->ioc_loginfo); in mpi3mr_pel_wait_complete()
4710 ioc_status, drv_cmd->ioc_loginfo); in mpi3mr_pel_wait_complete()
4714 if (drv_cmd->state & MPI3MR_CMD_REPLY_VALID) in mpi3mr_pel_wait_complete()
4715 pel_reply = (struct mpi3_pel_reply *)drv_cmd->reply; in mpi3mr_pel_wait_complete()
4723 pe_log_status = le16_to_cpu(pel_reply->pe_log_status); in mpi3mr_pel_wait_complete()
4735 if (drv_cmd->retry_count < MPI3MR_PEL_RETRY_COUNT) { in mpi3mr_pel_wait_complete()
4736 drv_cmd->retry_count++; in mpi3mr_pel_wait_complete()
4738 drv_cmd->retry_count); in mpi3mr_pel_wait_complete()
4744 drv_cmd->retry_count); in mpi3mr_pel_wait_complete()
4748 if (!mrioc->pel_abort_requested) { in mpi3mr_pel_wait_complete()
4749 mrioc->pel_cmds.retry_count = 0; in mpi3mr_pel_wait_complete()
4750 mpi3mr_pel_get_seqnum_post(mrioc, &mrioc->pel_cmds); in mpi3mr_pel_wait_complete()
4755 mrioc->pel_enabled = false; in mpi3mr_pel_wait_complete()
4757 drv_cmd->state = MPI3MR_CMD_NOTUSED; in mpi3mr_pel_wait_complete()
4758 drv_cmd->callback = NULL; in mpi3mr_pel_wait_complete()
4759 drv_cmd->retry_count = 0; in mpi3mr_pel_wait_complete()
4763 * mpi3mr_pel_get_seqnum_complete - PELGetSeqNum Completion callback
4781 pel_seqnum_virt = (struct mpi3_pel_seq *)mrioc->pel_seqnum_virt; in mpi3mr_pel_get_seqnum_complete()
4783 if (drv_cmd->state & MPI3MR_CMD_RESET) in mpi3mr_pel_get_seqnum_complete()
4786 ioc_status = drv_cmd->ioc_status & MPI3_IOCSTATUS_STATUS_MASK; in mpi3mr_pel_get_seqnum_complete()
4790 ioc_status, drv_cmd->ioc_loginfo); in mpi3mr_pel_get_seqnum_complete()
4794 if (drv_cmd->state & MPI3MR_CMD_REPLY_VALID) in mpi3mr_pel_get_seqnum_complete()
4795 pel_reply = (struct mpi3_pel_reply *)drv_cmd->reply; in mpi3mr_pel_get_seqnum_complete()
4802 if (le16_to_cpu(pel_reply->pe_log_status) != MPI3_PEL_STATUS_SUCCESS) { in mpi3mr_pel_get_seqnum_complete()
4805 le16_to_cpu(pel_reply->pe_log_status)); in mpi3mr_pel_get_seqnum_complete()
4810 if (drv_cmd->retry_count < MPI3MR_PEL_RETRY_COUNT) { in mpi3mr_pel_get_seqnum_complete()
4811 drv_cmd->retry_count++; in mpi3mr_pel_get_seqnum_complete()
4814 drv_cmd->retry_count); in mpi3mr_pel_get_seqnum_complete()
4821 drv_cmd->retry_count); in mpi3mr_pel_get_seqnum_complete()
4824 mrioc->pel_newest_seqnum = le32_to_cpu(pel_seqnum_virt->newest) + 1; in mpi3mr_pel_get_seqnum_complete()
4825 drv_cmd->retry_count = 0; in mpi3mr_pel_get_seqnum_complete()
4830 mrioc->pel_enabled = false; in mpi3mr_pel_get_seqnum_complete()
4832 drv_cmd->state = MPI3MR_CMD_NOTUSED; in mpi3mr_pel_get_seqnum_complete()
4833 drv_cmd->callback = NULL; in mpi3mr_pel_get_seqnum_complete()
4834 drv_cmd->retry_count = 0; in mpi3mr_pel_get_seqnum_complete()
4838 * mpi3mr_soft_reset_handler - Reset the controller
4856 * Return: 0 on success, non-zero on failure.
4868 mrioc->diagsave_timeout); in mpi3mr_soft_reset_handler()
4869 while (mrioc->diagsave_timeout) in mpi3mr_soft_reset_handler()
4876 if (!mutex_trylock(&mrioc->reset_mutex)) { in mpi3mr_soft_reset_handler()
4882 } while (mrioc->reset_in_progress == 1); in mpi3mr_soft_reset_handler()
4885 mrioc->prev_reset_result, in mpi3mr_soft_reset_handler()
4887 return mrioc->prev_reset_result; in mpi3mr_soft_reset_handler()
4892 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
4893 mrioc->reset_in_progress = 1; in mpi3mr_soft_reset_handler()
4894 mrioc->stop_bsgs = 1; in mpi3mr_soft_reset_handler()
4895 mrioc->prev_reset_result = -1; in mpi3mr_soft_reset_handler()
4901 mrioc->event_masks[i] = -1; in mpi3mr_soft_reset_handler()
4918 readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_soft_reset_handler()
4923 } while (--timeout); in mpi3mr_soft_reset_handler()
4933 if (mrioc->num_io_throttle_group != in mpi3mr_soft_reset_handler()
4934 mrioc->facts.max_io_throttle_group) { in mpi3mr_soft_reset_handler()
4937 mrioc->num_io_throttle_group, in mpi3mr_soft_reset_handler()
4938 mrioc->facts.max_io_throttle_group); in mpi3mr_soft_reset_handler()
4939 retval = -EPERM; in mpi3mr_soft_reset_handler()
4945 bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD); in mpi3mr_soft_reset_handler()
4946 bitmap_clear(mrioc->removepend_bitmap, 0, in mpi3mr_soft_reset_handler()
4947 mrioc->dev_handle_bitmap_bits); in mpi3mr_soft_reset_handler()
4948 bitmap_clear(mrioc->evtack_cmds_bitmap, 0, MPI3MR_NUM_EVTACKCMD); in mpi3mr_soft_reset_handler()
4954 if (mrioc->prepare_for_reset) { in mpi3mr_soft_reset_handler()
4955 mrioc->prepare_for_reset = 0; in mpi3mr_soft_reset_handler()
4956 mrioc->prepare_for_reset_timeout_counter = 0; in mpi3mr_soft_reset_handler()
4962 mrioc->name, reset_reason); in mpi3mr_soft_reset_handler()
4969 mrioc->diagsave_timeout = 0; in mpi3mr_soft_reset_handler()
4970 mrioc->reset_in_progress = 0; in mpi3mr_soft_reset_handler()
4971 mrioc->pel_abort_requested = 0; in mpi3mr_soft_reset_handler()
4972 if (mrioc->pel_enabled) { in mpi3mr_soft_reset_handler()
4973 mrioc->pel_cmds.retry_count = 0; in mpi3mr_soft_reset_handler()
4974 mpi3mr_pel_wait_post(mrioc, &mrioc->pel_cmds); in mpi3mr_soft_reset_handler()
4977 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
4979 mrioc->ts_update_counter = 0; in mpi3mr_soft_reset_handler()
4980 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_soft_reset_handler()
4981 if (mrioc->watchdog_work_q) in mpi3mr_soft_reset_handler()
4982 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_soft_reset_handler()
4983 &mrioc->watchdog_work, in mpi3mr_soft_reset_handler()
4985 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_soft_reset_handler()
4986 mrioc->stop_bsgs = 0; in mpi3mr_soft_reset_handler()
4987 if (mrioc->pel_enabled) in mpi3mr_soft_reset_handler()
4992 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
4993 mrioc->unrecoverable = 1; in mpi3mr_soft_reset_handler()
4994 mrioc->reset_in_progress = 0; in mpi3mr_soft_reset_handler()
4995 retval = -1; in mpi3mr_soft_reset_handler()
4998 mrioc->prev_reset_result = retval; in mpi3mr_soft_reset_handler()
4999 mutex_unlock(&mrioc->reset_mutex); in mpi3mr_soft_reset_handler()
5007 * mpi3mr_free_config_dma_memory - free memory for config page
5020 if ((mem_desc->size > mrioc->cfg_page_sz) && mem_desc->addr) { in mpi3mr_free_config_dma_memory()
5021 dma_free_coherent(&mrioc->pdev->dev, mem_desc->size, in mpi3mr_free_config_dma_memory()
5022 mem_desc->addr, mem_desc->dma_addr); in mpi3mr_free_config_dma_memory()
5023 mem_desc->addr = NULL; in mpi3mr_free_config_dma_memory()
5028 * mpi3mr_alloc_config_dma_memory - Alloc memory for config page
5036 * Return: 0 on success, non-zero on failure.
5041 if (mem_desc->size > mrioc->cfg_page_sz) { in mpi3mr_alloc_config_dma_memory()
5042 mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_config_dma_memory()
5043 mem_desc->size, &mem_desc->dma_addr, GFP_KERNEL); in mpi3mr_alloc_config_dma_memory()
5044 if (!mem_desc->addr) in mpi3mr_alloc_config_dma_memory()
5045 return -ENOMEM; in mpi3mr_alloc_config_dma_memory()
5047 mem_desc->addr = mrioc->cfg_page; in mpi3mr_alloc_config_dma_memory()
5048 mem_desc->dma_addr = mrioc->cfg_page_dma; in mpi3mr_alloc_config_dma_memory()
5049 memset(mem_desc->addr, 0, mrioc->cfg_page_sz); in mpi3mr_alloc_config_dma_memory()
5055 * mpi3mr_post_cfg_req - Issue config requests and wait
5069 * Return: 0 on success, non-zero on failure.
5076 mutex_lock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5077 if (mrioc->cfg_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_post_cfg_req()
5078 retval = -1; in mpi3mr_post_cfg_req()
5080 mutex_unlock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5083 mrioc->cfg_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_post_cfg_req()
5084 mrioc->cfg_cmds.is_waiting = 1; in mpi3mr_post_cfg_req()
5085 mrioc->cfg_cmds.callback = NULL; in mpi3mr_post_cfg_req()
5086 mrioc->cfg_cmds.ioc_status = 0; in mpi3mr_post_cfg_req()
5087 mrioc->cfg_cmds.ioc_loginfo = 0; in mpi3mr_post_cfg_req()
5089 cfg_req->host_tag = cpu_to_le16(MPI3MR_HOSTTAG_CFG_CMDS); in mpi3mr_post_cfg_req()
5090 cfg_req->function = MPI3_FUNCTION_CONFIG; in mpi3mr_post_cfg_req()
5092 init_completion(&mrioc->cfg_cmds.done); in mpi3mr_post_cfg_req()
5094 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_post_cfg_req()
5102 wait_for_completion_timeout(&mrioc->cfg_cmds.done, (timeout * HZ)); in mpi3mr_post_cfg_req()
5103 if (!(mrioc->cfg_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_post_cfg_req()
5107 retval = -1; in mpi3mr_post_cfg_req()
5110 *ioc_status = mrioc->cfg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK; in mpi3mr_post_cfg_req()
5114 *ioc_status, mrioc->cfg_cmds.ioc_loginfo); in mpi3mr_post_cfg_req()
5117 mrioc->cfg_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_post_cfg_req()
5118 mutex_unlock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5125 * mpi3mr_process_cfg_req - config page request processor
5158 * Return: 0 on success, non-zero on failure.
5166 int retval = -1; in mpi3mr_process_cfg_req()
5172 if (cfg_req->action == MPI3_CONFIG_ACTION_PAGE_HEADER) in mpi3mr_process_cfg_req()
5177 cfg_req->action, cfg_req->page_type, in mpi3mr_process_cfg_req()
5178 cfg_req->page_number); in mpi3mr_process_cfg_req()
5181 switch (cfg_hdr->page_attribute & MPI3_CONFIG_PAGEATTR_MASK) { in mpi3mr_process_cfg_req()
5183 if (cfg_req->action in mpi3mr_process_cfg_req()
5188 if ((cfg_req->action == in mpi3mr_process_cfg_req()
5190 (cfg_req->action == in mpi3mr_process_cfg_req()
5201 cfg_req->action, cfg_req->page_type, in mpi3mr_process_cfg_req()
5202 cfg_req->page_number, cfg_hdr->page_attribute); in mpi3mr_process_cfg_req()
5205 mem_desc.size = le16_to_cpu(cfg_hdr->page_length) * 4; in mpi3mr_process_cfg_req()
5206 cfg_req->page_length = cfg_hdr->page_length; in mpi3mr_process_cfg_req()
5207 cfg_req->page_version = cfg_hdr->page_version; in mpi3mr_process_cfg_req()
5212 mpi3mr_add_sg_single(&cfg_req->sgl, sgl_flags, mem_desc.size, in mpi3mr_process_cfg_req()
5215 if ((cfg_req->action == MPI3_CONFIG_ACTION_WRITE_PERSISTENT) || in mpi3mr_process_cfg_req()
5216 (cfg_req->action == MPI3_CONFIG_ACTION_WRITE_CURRENT)) { in mpi3mr_process_cfg_req()
5220 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_process_cfg_req()
5229 (cfg_req->action != MPI3_CONFIG_ACTION_WRITE_PERSISTENT) && in mpi3mr_process_cfg_req()
5230 (cfg_req->action != MPI3_CONFIG_ACTION_WRITE_CURRENT)) { in mpi3mr_process_cfg_req()
5234 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_process_cfg_req()
5244 * mpi3mr_cfg_get_dev_pg0 - Read current device page0
5258 * Return: 0 on success, non-zero on failure.
5298 return -1; in mpi3mr_cfg_get_dev_pg0()
5303 * mpi3mr_cfg_get_sas_phy_pg0 - Read current SAS Phy page0
5317 * Return: 0 on success, non-zero on failure.
5358 return -1; in mpi3mr_cfg_get_sas_phy_pg0()
5362 * mpi3mr_cfg_get_sas_phy_pg1 - Read current SAS Phy page1
5376 * Return: 0 on success, non-zero on failure.
5417 return -1; in mpi3mr_cfg_get_sas_phy_pg1()
5422 * mpi3mr_cfg_get_sas_exp_pg0 - Read current SAS Expander page0
5436 * Return: 0 on success, non-zero on failure.
5478 return -1; in mpi3mr_cfg_get_sas_exp_pg0()
5482 * mpi3mr_cfg_get_sas_exp_pg1 - Read current SAS Expander page1
5496 * Return: 0 on success, non-zero on failure.
5538 return -1; in mpi3mr_cfg_get_sas_exp_pg1()
5542 * mpi3mr_cfg_get_enclosure_pg0 - Read current Enclosure page0
5556 * Return: 0 on success, non-zero on failure.
5597 return -1; in mpi3mr_cfg_get_enclosure_pg0()
5602 * mpi3mr_cfg_get_sas_io_unit_pg0 - Read current SASIOUnit page0
5611 * Return: 0 on success, non-zero on failure.
5654 return -1; in mpi3mr_cfg_get_sas_io_unit_pg0()
5658 * mpi3mr_cfg_get_sas_io_unit_pg1 - Read current SASIOUnit page1
5667 * Return: 0 on success, non-zero on failure.
5710 return -1; in mpi3mr_cfg_get_sas_io_unit_pg1()
5714 * mpi3mr_cfg_set_sas_io_unit_pg1 - Write SASIOUnit page1
5724 * Return: 0 on success, non-zero on failure.
5779 return -1; in mpi3mr_cfg_set_sas_io_unit_pg1()
5783 * mpi3mr_cfg_get_driver_pg1 - Read current Driver page1
5792 * Return: 0 on success, non-zero on failure.
5835 return -1; in mpi3mr_cfg_get_driver_pg1()