Lines Matching refs:mrioc

14 mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type, u16 reset_reason);
15 static int mpi3mr_setup_admin_qpair(struct mpi3mr_ioc *mrioc);
16 static void mpi3mr_process_factsdata(struct mpi3mr_ioc *mrioc,
18 static void mpi3mr_pel_wait_complete(struct mpi3mr_ioc *mrioc,
56 static void mpi3mr_sync_irqs(struct mpi3mr_ioc *mrioc) in mpi3mr_sync_irqs() argument
60 max_vectors = mrioc->intr_info_count; in mpi3mr_sync_irqs()
63 synchronize_irq(pci_irq_vector(mrioc->pdev, i)); in mpi3mr_sync_irqs()
66 void mpi3mr_ioc_disable_intr(struct mpi3mr_ioc *mrioc) in mpi3mr_ioc_disable_intr() argument
68 mrioc->intr_enabled = 0; in mpi3mr_ioc_disable_intr()
69 mpi3mr_sync_irqs(mrioc); in mpi3mr_ioc_disable_intr()
72 void mpi3mr_ioc_enable_intr(struct mpi3mr_ioc *mrioc) in mpi3mr_ioc_enable_intr() argument
74 mrioc->intr_enabled = 1; in mpi3mr_ioc_enable_intr()
77 static void mpi3mr_cleanup_isr(struct mpi3mr_ioc *mrioc) in mpi3mr_cleanup_isr() argument
81 mpi3mr_ioc_disable_intr(mrioc); in mpi3mr_cleanup_isr()
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()
114 void *mpi3mr_get_reply_virt_addr(struct mpi3mr_ioc *mrioc, in mpi3mr_get_reply_virt_addr() argument
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()
127 void *mpi3mr_get_sensebuf_virt_addr(struct mpi3mr_ioc *mrioc, in mpi3mr_get_sensebuf_virt_addr() argument
133 return mrioc->sense_buf + (phys_addr - mrioc->sense_buf_dma); in mpi3mr_get_sensebuf_virt_addr()
136 static void mpi3mr_repost_reply_buf(struct mpi3mr_ioc *mrioc, in mpi3mr_repost_reply_buf() argument
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()
154 void mpi3mr_repost_sense_buf(struct mpi3mr_ioc *mrioc, in mpi3mr_repost_sense_buf() argument
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()
171 static void mpi3mr_print_event_data(struct mpi3mr_ioc *mrioc, in mpi3mr_print_event_data() argument
199 ioc_info(mrioc, "Device Added: dev=0x%04x Form=0x%x\n", in mpi3mr_print_event_data()
207 ioc_info(mrioc, "Device Info Changed: dev=0x%04x Form=0x%x\n", in mpi3mr_print_event_data()
215 ioc_info(mrioc, "Device status Change: dev=0x%04x RC=0x%x\n", in mpi3mr_print_event_data()
223 ioc_info(mrioc, "SAS Discovery: (%s) status (0x%08x)\n", in mpi3mr_print_event_data()
266 ioc_info(mrioc, "PCIE Enumeration: (%s)", in mpi3mr_print_event_data()
270 ioc_info(mrioc, "enumeration_status(0x%08x)\n", in mpi3mr_print_event_data()
285 ioc_info(mrioc, "%s\n", desc); in mpi3mr_print_event_data()
288 static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc, in mpi3mr_handle_events() argument
294 mrioc->change_count = le16_to_cpu(event_reply->ioc_change_count); in mpi3mr_handle_events()
295 mpi3mr_print_event_data(mrioc, event_reply); in mpi3mr_handle_events()
296 mpi3mr_os_handle_events(mrioc, event_reply); in mpi3mr_handle_events()
300 mpi3mr_get_drv_cmd(struct mpi3mr_ioc *mrioc, u16 host_tag, in mpi3mr_get_drv_cmd() argument
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()
323 mpi3mr_handle_events(mrioc, def_reply); in mpi3mr_get_drv_cmd()
331 return &mrioc->dev_rmhs_cmds[idx]; in mpi3mr_get_drv_cmd()
337 return &mrioc->evtack_cmds[idx]; in mpi3mr_get_drv_cmd()
343 static void mpi3mr_process_admin_reply_desc(struct mpi3mr_ioc *mrioc, in mpi3mr_process_admin_reply_desc() argument
371 mpi3mr_reply_trigger(mrioc, masked_ioc_status, ioc_loginfo); in mpi3mr_process_admin_reply_desc()
376 def_reply = mpi3mr_get_reply_virt_addr(mrioc, *reply_dma); in mpi3mr_process_admin_reply_desc()
387 sense_buf = mpi3mr_get_sensebuf_virt_addr(mrioc, in mpi3mr_process_admin_reply_desc()
393 mpi3mr_scsisense_trigger(mrioc, sshdr.sense_key, in mpi3mr_process_admin_reply_desc()
397 mpi3mr_reply_trigger(mrioc, masked_ioc_status, ioc_loginfo); in mpi3mr_process_admin_reply_desc()
407 cmdptr = mpi3mr_get_drv_cmd(mrioc, host_tag, def_reply); in mpi3mr_process_admin_reply_desc()
420 mrioc->reply_sz); in mpi3mr_process_admin_reply_desc()
431 cmdptr->callback(mrioc, cmdptr); in mpi3mr_process_admin_reply_desc()
436 mpi3mr_repost_sense_buf(mrioc, in mpi3mr_process_admin_reply_desc()
440 int mpi3mr_process_admin_reply_q(struct mpi3mr_ioc *mrioc) in mpi3mr_process_admin_reply_q() argument
442 u32 exp_phase = mrioc->admin_reply_ephase; in mpi3mr_process_admin_reply_q()
443 u32 admin_reply_ci = mrioc->admin_reply_ci; in mpi3mr_process_admin_reply_q()
449 if (!atomic_add_unless(&mrioc->admin_reply_q_in_use, 1, 1)) in mpi3mr_process_admin_reply_q()
452 reply_desc = (struct mpi3_default_reply_descriptor *)mrioc->admin_reply_base + in mpi3mr_process_admin_reply_q()
457 atomic_dec(&mrioc->admin_reply_q_in_use); in mpi3mr_process_admin_reply_q()
462 if (mrioc->unrecoverable) in mpi3mr_process_admin_reply_q()
465 mrioc->admin_req_ci = le16_to_cpu(reply_desc->request_queue_ci); in mpi3mr_process_admin_reply_q()
466 mpi3mr_process_admin_reply_desc(mrioc, reply_desc, &reply_dma); in mpi3mr_process_admin_reply_q()
468 mpi3mr_repost_reply_buf(mrioc, reply_dma); in mpi3mr_process_admin_reply_q()
471 if (++admin_reply_ci == mrioc->num_admin_replies) { in mpi3mr_process_admin_reply_q()
476 (struct mpi3_default_reply_descriptor *)mrioc->admin_reply_base + in mpi3mr_process_admin_reply_q()
483 &mrioc->sysif_regs->admin_reply_queue_ci); in mpi3mr_process_admin_reply_q()
488 writel(admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci); in mpi3mr_process_admin_reply_q()
489 mrioc->admin_reply_ci = admin_reply_ci; in mpi3mr_process_admin_reply_q()
490 mrioc->admin_reply_ephase = exp_phase; in mpi3mr_process_admin_reply_q()
491 atomic_dec(&mrioc->admin_reply_q_in_use); in mpi3mr_process_admin_reply_q()
530 int mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc, in mpi3mr_process_op_reply_q() argument
557 if (mrioc->unrecoverable) in mpi3mr_process_op_reply_q()
561 op_req_q = &mrioc->req_qinfo[req_q_idx]; in mpi3mr_process_op_reply_q()
564 mpi3mr_process_op_reply_desc(mrioc, reply_desc, &reply_dma, in mpi3mr_process_op_reply_q()
568 mpi3mr_repost_reply_buf(mrioc, reply_dma); in mpi3mr_process_op_reply_q()
587 if (num_op_reply > mrioc->max_host_ios) { in mpi3mr_process_op_reply_q()
594 &mrioc->sysif_regs->oper_queue_indexes[reply_qidx].consumer_index); in mpi3mr_process_op_reply_q()
601 &mrioc->sysif_regs->oper_queue_indexes[reply_qidx].consumer_index); in mpi3mr_process_op_reply_q()
624 struct mpi3mr_ioc *mrioc; in mpi3mr_blk_mq_poll() local
626 mrioc = (struct mpi3mr_ioc *)shost->hostdata; in mpi3mr_blk_mq_poll()
628 if ((mrioc->reset_in_progress || mrioc->prepare_for_reset || in mpi3mr_blk_mq_poll()
629 mrioc->unrecoverable || mrioc->pci_err_recovery)) in mpi3mr_blk_mq_poll()
632 num_entries = mpi3mr_process_op_reply_q(mrioc, in mpi3mr_blk_mq_poll()
633 &mrioc->op_reply_qinfo[queue_num]); in mpi3mr_blk_mq_poll()
641 struct mpi3mr_ioc *mrioc; in mpi3mr_isr_primary() local
648 mrioc = intr_info->mrioc; in mpi3mr_isr_primary()
650 if (!mrioc->intr_enabled) in mpi3mr_isr_primary()
656 num_admin_replies = mpi3mr_process_admin_reply_q(mrioc); in mpi3mr_isr_primary()
658 num_op_reply = mpi3mr_process_op_reply_q(mrioc, in mpi3mr_isr_primary()
709 struct mpi3mr_ioc *mrioc; in mpi3mr_isr_poll() local
716 mrioc = intr_info->mrioc; in mpi3mr_isr_poll()
721 if (!mrioc->intr_enabled || mrioc->unrecoverable) in mpi3mr_isr_poll()
725 mpi3mr_process_admin_reply_q(mrioc); in mpi3mr_isr_poll()
728 mpi3mr_process_op_reply_q(mrioc, in mpi3mr_isr_poll()
734 (num_op_reply < mrioc->max_host_ios)); in mpi3mr_isr_poll()
753 static inline int mpi3mr_request_irq(struct mpi3mr_ioc *mrioc, u16 index) in mpi3mr_request_irq() argument
755 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_request_irq()
756 struct mpi3mr_intr_info *intr_info = mrioc->intr_info + index; in mpi3mr_request_irq()
759 intr_info->mrioc = mrioc; in mpi3mr_request_irq()
764 mrioc->driver_name, mrioc->id, index); in mpi3mr_request_irq()
774 ioc_err(mrioc, "%s: Unable to allocate interrupt %d!\n", in mpi3mr_request_irq()
783 static void mpi3mr_calc_poll_queues(struct mpi3mr_ioc *mrioc, u16 max_vectors) in mpi3mr_calc_poll_queues() argument
785 if (!mrioc->requested_poll_qcount) in mpi3mr_calc_poll_queues()
790 (mrioc->requested_poll_qcount < max_vectors - 2)) { in mpi3mr_calc_poll_queues()
791 ioc_info(mrioc, in mpi3mr_calc_poll_queues()
793 mrioc->requested_poll_qcount, max_vectors); in mpi3mr_calc_poll_queues()
795 ioc_info(mrioc, in mpi3mr_calc_poll_queues()
797 mrioc->requested_poll_qcount, max_vectors); in mpi3mr_calc_poll_queues()
798 mrioc->requested_poll_qcount = 0; in mpi3mr_calc_poll_queues()
811 static int mpi3mr_setup_isr(struct mpi3mr_ioc *mrioc, u8 setup_one) in mpi3mr_setup_isr() argument
819 if (mrioc->is_intr_info_set) in mpi3mr_setup_isr()
822 mpi3mr_cleanup_isr(mrioc); in mpi3mr_setup_isr()
826 retval = pci_alloc_irq_vectors(mrioc->pdev, in mpi3mr_setup_isr()
829 ioc_err(mrioc, "cannot allocate irq vectors, ret %d\n", in mpi3mr_setup_isr()
835 min_t(int, mrioc->cpu_count + 1 + in mpi3mr_setup_isr()
836 mrioc->requested_poll_qcount, mrioc->msix_count); in mpi3mr_setup_isr()
838 mpi3mr_calc_poll_queues(mrioc, max_vectors); in mpi3mr_setup_isr()
840 ioc_info(mrioc, in mpi3mr_setup_isr()
842 mrioc->msix_count, mrioc->cpu_count); in mpi3mr_setup_isr()
843 ioc_info(mrioc, in mpi3mr_setup_isr()
845 max_vectors, mrioc->requested_poll_qcount); in mpi3mr_setup_isr()
847 desc.post_vectors = mrioc->requested_poll_qcount; in mpi3mr_setup_isr()
851 retval = pci_alloc_irq_vectors_affinity(mrioc->pdev, in mpi3mr_setup_isr()
855 ioc_err(mrioc, "cannot allocate irq vectors, ret %d\n", in mpi3mr_setup_isr()
866 mrioc->op_reply_q_offset = 0; in mpi3mr_setup_isr()
868 ioc_info(mrioc, in mpi3mr_setup_isr()
874 mrioc->op_reply_q_offset = (max_vectors > 1) ? 1 : 0; in mpi3mr_setup_isr()
876 mpi3mr_calc_poll_queues(mrioc, max_vectors); in mpi3mr_setup_isr()
880 mrioc->intr_info = kzalloc(sizeof(struct mpi3mr_intr_info) * max_vectors, in mpi3mr_setup_isr()
882 if (!mrioc->intr_info) { in mpi3mr_setup_isr()
884 pci_free_irq_vectors(mrioc->pdev); in mpi3mr_setup_isr()
888 retval = mpi3mr_request_irq(mrioc, i); in mpi3mr_setup_isr()
890 mrioc->intr_info_count = i; in mpi3mr_setup_isr()
895 mrioc->is_intr_info_set = true; in mpi3mr_setup_isr()
896 mrioc->intr_info_count = max_vectors; in mpi3mr_setup_isr()
897 mpi3mr_ioc_enable_intr(mrioc); in mpi3mr_setup_isr()
901 mpi3mr_cleanup_isr(mrioc); in mpi3mr_setup_isr()
1044 static inline bool mpi3mr_is_fault_recoverable(struct mpi3mr_ioc *mrioc) in mpi3mr_is_fault_recoverable() argument
1048 fault = (readl(&mrioc->sysif_regs->fault) & in mpi3mr_is_fault_recoverable()
1054 ioc_warn(mrioc, in mpi3mr_is_fault_recoverable()
1058 ioc_warn(mrioc, in mpi3mr_is_fault_recoverable()
1077 void mpi3mr_print_fault_info(struct mpi3mr_ioc *mrioc) in mpi3mr_print_fault_info() argument
1081 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_print_fault_info()
1084 code = readl(&mrioc->sysif_regs->fault); in mpi3mr_print_fault_info()
1085 code1 = readl(&mrioc->sysif_regs->fault_info[0]); in mpi3mr_print_fault_info()
1086 code2 = readl(&mrioc->sysif_regs->fault_info[1]); in mpi3mr_print_fault_info()
1087 code3 = readl(&mrioc->sysif_regs->fault_info[2]); in mpi3mr_print_fault_info()
1089 ioc_info(mrioc, in mpi3mr_print_fault_info()
1104 enum mpi3mr_iocstate mpi3mr_get_iocstate(struct mpi3mr_ioc *mrioc) in mpi3mr_get_iocstate() argument
1109 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_get_iocstate()
1110 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_get_iocstate()
1112 if (mrioc->unrecoverable) in mpi3mr_get_iocstate()
1138 static void mpi3mr_free_ioctl_dma_memory(struct mpi3mr_ioc *mrioc) in mpi3mr_free_ioctl_dma_memory() argument
1143 if (!mrioc->ioctl_dma_pool) in mpi3mr_free_ioctl_dma_memory()
1147 mem_desc = &mrioc->ioctl_sge[i]; in mpi3mr_free_ioctl_dma_memory()
1149 dma_pool_free(mrioc->ioctl_dma_pool, in mpi3mr_free_ioctl_dma_memory()
1155 dma_pool_destroy(mrioc->ioctl_dma_pool); in mpi3mr_free_ioctl_dma_memory()
1156 mrioc->ioctl_dma_pool = NULL; in mpi3mr_free_ioctl_dma_memory()
1157 mem_desc = &mrioc->ioctl_chain_sge; in mpi3mr_free_ioctl_dma_memory()
1160 dma_free_coherent(&mrioc->pdev->dev, mem_desc->size, in mpi3mr_free_ioctl_dma_memory()
1164 mem_desc = &mrioc->ioctl_resp_sge; in mpi3mr_free_ioctl_dma_memory()
1166 dma_free_coherent(&mrioc->pdev->dev, mem_desc->size, in mpi3mr_free_ioctl_dma_memory()
1171 mrioc->ioctl_sges_allocated = false; in mpi3mr_free_ioctl_dma_memory()
1183 static void mpi3mr_alloc_ioctl_dma_memory(struct mpi3mr_ioc *mrioc) in mpi3mr_alloc_ioctl_dma_memory() argument
1189 mrioc->ioctl_dma_pool = dma_pool_create("ioctl dma pool", in mpi3mr_alloc_ioctl_dma_memory()
1190 &mrioc->pdev->dev, in mpi3mr_alloc_ioctl_dma_memory()
1194 if (!mrioc->ioctl_dma_pool) { in mpi3mr_alloc_ioctl_dma_memory()
1195 ioc_err(mrioc, "ioctl_dma_pool: dma_pool_create failed\n"); in mpi3mr_alloc_ioctl_dma_memory()
1200 mem_desc = &mrioc->ioctl_sge[i]; in mpi3mr_alloc_ioctl_dma_memory()
1202 mem_desc->addr = dma_pool_zalloc(mrioc->ioctl_dma_pool, in mpi3mr_alloc_ioctl_dma_memory()
1209 mem_desc = &mrioc->ioctl_chain_sge; in mpi3mr_alloc_ioctl_dma_memory()
1211 mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_ioctl_dma_memory()
1218 mem_desc = &mrioc->ioctl_resp_sge; in mpi3mr_alloc_ioctl_dma_memory()
1220 mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_ioctl_dma_memory()
1227 mrioc->ioctl_sges_allocated = true; in mpi3mr_alloc_ioctl_dma_memory()
1231 ioc_warn(mrioc, "cannot allocate DMA memory for the mpt commands\n" in mpi3mr_alloc_ioctl_dma_memory()
1233 mpi3mr_free_ioctl_dma_memory(mrioc); in mpi3mr_alloc_ioctl_dma_memory()
1245 static inline void mpi3mr_clear_reset_history(struct mpi3mr_ioc *mrioc) in mpi3mr_clear_reset_history() argument
1249 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_clear_reset_history()
1251 writel(ioc_status, &mrioc->sysif_regs->ioc_status); in mpi3mr_clear_reset_history()
1264 static int mpi3mr_issue_and_process_mur(struct mpi3mr_ioc *mrioc, in mpi3mr_issue_and_process_mur() argument
1270 ioc_info(mrioc, "Issuing Message unit Reset(MUR)\n"); in mpi3mr_issue_and_process_mur()
1271 if (mrioc->unrecoverable) { in mpi3mr_issue_and_process_mur()
1272 ioc_info(mrioc, "IOC is unrecoverable MUR not issued\n"); in mpi3mr_issue_and_process_mur()
1275 mpi3mr_clear_reset_history(mrioc); in mpi3mr_issue_and_process_mur()
1278 (mrioc->facts.ioc_num << in mpi3mr_issue_and_process_mur()
1280 writel(scratch_pad0, &mrioc->sysif_regs->scratchpad[0]); in mpi3mr_issue_and_process_mur()
1281 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1283 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1287 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_and_process_mur()
1289 mpi3mr_clear_reset_history(mrioc); in mpi3mr_issue_and_process_mur()
1293 mpi3mr_print_fault_info(mrioc); in mpi3mr_issue_and_process_mur()
1299 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_and_process_mur()
1305 ioc_info(mrioc, "Base IOC Sts/Config after %s MUR is (0x%x)/(0x%x)\n", in mpi3mr_issue_and_process_mur()
1319 mpi3mr_revalidate_factsdata(struct mpi3mr_ioc *mrioc) in mpi3mr_revalidate_factsdata() argument
1323 if (mrioc->facts.reply_sz > mrioc->reply_sz) { in mpi3mr_revalidate_factsdata()
1324 ioc_err(mrioc, in mpi3mr_revalidate_factsdata()
1326 mrioc->reply_sz, mrioc->facts.reply_sz); in mpi3mr_revalidate_factsdata()
1330 if (mrioc->facts.max_op_reply_q < mrioc->num_op_reply_q) { in mpi3mr_revalidate_factsdata()
1331 ioc_err(mrioc, in mpi3mr_revalidate_factsdata()
1333 mrioc->num_op_reply_q, in mpi3mr_revalidate_factsdata()
1334 mrioc->facts.max_op_reply_q); in mpi3mr_revalidate_factsdata()
1338 if (mrioc->facts.max_op_req_q < mrioc->num_op_req_q) { in mpi3mr_revalidate_factsdata()
1339 ioc_err(mrioc, in mpi3mr_revalidate_factsdata()
1341 mrioc->num_op_req_q, mrioc->facts.max_op_req_q); in mpi3mr_revalidate_factsdata()
1345 if (mrioc->shost->max_sectors != (mrioc->facts.max_data_length / 512)) in mpi3mr_revalidate_factsdata()
1346 ioc_err(mrioc, "Warning: The maximum data transfer length\n" in mpi3mr_revalidate_factsdata()
1349 mrioc->shost->max_sectors * 512, mrioc->facts.max_data_length); in mpi3mr_revalidate_factsdata()
1351 if ((mrioc->sas_transport_enabled) && (mrioc->facts.ioc_capabilities & in mpi3mr_revalidate_factsdata()
1353 ioc_err(mrioc, in mpi3mr_revalidate_factsdata()
1358 if (mrioc->facts.max_devhandle > mrioc->dev_handle_bitmap_bits) { in mpi3mr_revalidate_factsdata()
1359 removepend_bitmap = bitmap_zalloc(mrioc->facts.max_devhandle, in mpi3mr_revalidate_factsdata()
1362 ioc_err(mrioc, in mpi3mr_revalidate_factsdata()
1364 mrioc->dev_handle_bitmap_bits, in mpi3mr_revalidate_factsdata()
1365 mrioc->facts.max_devhandle); in mpi3mr_revalidate_factsdata()
1368 bitmap_free(mrioc->removepend_bitmap); in mpi3mr_revalidate_factsdata()
1369 mrioc->removepend_bitmap = removepend_bitmap; in mpi3mr_revalidate_factsdata()
1370 ioc_info(mrioc, in mpi3mr_revalidate_factsdata()
1372 mrioc->dev_handle_bitmap_bits, in mpi3mr_revalidate_factsdata()
1373 mrioc->facts.max_devhandle); in mpi3mr_revalidate_factsdata()
1374 mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle; in mpi3mr_revalidate_factsdata()
1389 static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc) in mpi3mr_bring_ioc_ready() argument
1400 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_bring_ioc_ready()
1401 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1402 base_info = lo_hi_readq(&mrioc->sysif_regs->ioc_information); in mpi3mr_bring_ioc_ready()
1403 ioc_info(mrioc, "ioc_status(0x%08x), ioc_config(0x%08x), ioc_info(0x%016llx) at the bringup\n", in mpi3mr_bring_ioc_ready()
1406 if (!mpi3mr_is_fault_recoverable(mrioc)) { in mpi3mr_bring_ioc_ready()
1407 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1412 mrioc->ready_timeout = in mpi3mr_bring_ioc_ready()
1416 ioc_info(mrioc, "ready timeout: %d seconds\n", mrioc->ready_timeout); in mpi3mr_bring_ioc_ready()
1418 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1419 ioc_info(mrioc, "controller is in %s state during detection\n", in mpi3mr_bring_ioc_ready()
1422 timeout = mrioc->ready_timeout * 10; in mpi3mr_bring_ioc_ready()
1425 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1431 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1432 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1433 ioc_err(mrioc, "controller is not present while waiting to reset\n"); in mpi3mr_bring_ioc_ready()
1441 ioc_info(mrioc, "issuing message unit reset (MUR) to bring to reset state\n"); in mpi3mr_bring_ioc_ready()
1442 retval = mpi3mr_issue_and_process_mur(mrioc, in mpi3mr_bring_ioc_ready()
1444 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1446 ioc_err(mrioc, in mpi3mr_bring_ioc_ready()
1453 mpi3mr_print_fault_info(mrioc); in mpi3mr_bring_ioc_ready()
1456 readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_bring_ioc_ready()
1460 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1461 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1462 ioc_err(mrioc, "controller is not present at the bringup\n"); in mpi3mr_bring_ioc_ready()
1468 mpi3mr_print_fault_info(mrioc); in mpi3mr_bring_ioc_ready()
1469 ioc_info(mrioc, "issuing soft reset to bring to reset state\n"); in mpi3mr_bring_ioc_ready()
1470 retval = mpi3mr_issue_reset(mrioc, in mpi3mr_bring_ioc_ready()
1474 ioc_err(mrioc, in mpi3mr_bring_ioc_ready()
1479 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1481 ioc_err(mrioc, in mpi3mr_bring_ioc_ready()
1486 mpi3mr_clear_reset_history(mrioc); in mpi3mr_bring_ioc_ready()
1487 retval = mpi3mr_setup_admin_qpair(mrioc); in mpi3mr_bring_ioc_ready()
1489 ioc_err(mrioc, "failed to setup admin queues: error %d\n", in mpi3mr_bring_ioc_ready()
1494 ioc_info(mrioc, "bringing controller to ready state\n"); in mpi3mr_bring_ioc_ready()
1495 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1497 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_bring_ioc_ready()
1502 timeout = mrioc->ready_timeout * 10; in mpi3mr_bring_ioc_ready()
1504 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1506 ioc_info(mrioc, in mpi3mr_bring_ioc_ready()
1511 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_bring_ioc_ready()
1514 mpi3mr_print_fault_info(mrioc); in mpi3mr_bring_ioc_ready()
1517 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_bring_ioc_ready()
1518 mrioc->unrecoverable = 1; in mpi3mr_bring_ioc_ready()
1519 ioc_err(mrioc, in mpi3mr_bring_ioc_ready()
1526 } while (elapsed_time_sec < mrioc->ready_timeout); in mpi3mr_bring_ioc_ready()
1530 if ((retry < 2) && (elapsed_time_sec < (mrioc->ready_timeout - 60))) { in mpi3mr_bring_ioc_ready()
1533 ioc_warn(mrioc, "retrying to bring IOC ready, retry_count:%d\n" in mpi3mr_bring_ioc_ready()
1538 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_bring_ioc_ready()
1539 ioc_err(mrioc, in mpi3mr_bring_ioc_ready()
1574 static inline bool mpi3mr_diagfault_success(struct mpi3mr_ioc *mrioc, in mpi3mr_diagfault_success() argument
1581 fault = readl(&mrioc->sysif_regs->fault) & MPI3_SYSIF_FAULT_CODE_MASK; in mpi3mr_diagfault_success()
1583 mpi3mr_print_fault_info(mrioc); in mpi3mr_diagfault_success()
1598 static inline void mpi3mr_set_diagsave(struct mpi3mr_ioc *mrioc) in mpi3mr_set_diagsave() argument
1602 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_set_diagsave()
1604 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_set_diagsave()
1620 static int mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type, in mpi3mr_issue_reset() argument
1631 if (mrioc->unrecoverable) in mpi3mr_issue_reset()
1638 ioc_info(mrioc, "%s reset due to %s(0x%x)\n", in mpi3mr_issue_reset()
1642 mpi3mr_clear_reset_history(mrioc); in mpi3mr_issue_reset()
1644 ioc_info(mrioc, in mpi3mr_issue_reset()
1648 ioc_err(mrioc, in mpi3mr_issue_reset()
1652 mrioc->unrecoverable = 1; in mpi3mr_issue_reset()
1657 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1659 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1661 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1663 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1665 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1667 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1669 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1671 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_issue_reset()
1672 ioc_info(mrioc, in mpi3mr_issue_reset()
1678 MPI3MR_RESET_REASON_OSTYPE_SHIFT) | (mrioc->facts.ioc_num << in mpi3mr_issue_reset()
1680 writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]); in mpi3mr_issue_reset()
1682 &mrioc->sysif_regs->host_diagnostic); in mpi3mr_issue_reset()
1686 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1688 readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_reset()
1692 mpi3mr_clear_reset_history(mrioc); in mpi3mr_issue_reset()
1698 mpi3mr_print_fault_info(mrioc); in mpi3mr_issue_reset()
1702 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1703 if (mpi3mr_diagfault_success(mrioc, ioc_status)) { in mpi3mr_issue_reset()
1715 &mrioc->sysif_regs->write_sequence); in mpi3mr_issue_reset()
1717 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_reset()
1718 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_reset()
1719 ioc_info(mrioc, in mpi3mr_issue_reset()
1724 mrioc->unrecoverable = 1; in mpi3mr_issue_reset()
1741 int mpi3mr_admin_request_post(struct mpi3mr_ioc *mrioc, void *admin_req, in mpi3mr_admin_request_post() argument
1749 if (mrioc->unrecoverable) { in mpi3mr_admin_request_post()
1750 ioc_err(mrioc, "%s : Unrecoverable controller\n", __func__); in mpi3mr_admin_request_post()
1754 spin_lock_irqsave(&mrioc->admin_req_lock, flags); in mpi3mr_admin_request_post()
1755 areq_pi = mrioc->admin_req_pi; in mpi3mr_admin_request_post()
1756 areq_ci = mrioc->admin_req_ci; in mpi3mr_admin_request_post()
1757 max_entries = mrioc->num_admin_req; in mpi3mr_admin_request_post()
1760 ioc_err(mrioc, "AdminReqQ full condition detected\n"); in mpi3mr_admin_request_post()
1764 if (!ignore_reset && mrioc->reset_in_progress) { in mpi3mr_admin_request_post()
1765 ioc_err(mrioc, "AdminReqQ submit reset in progress\n"); in mpi3mr_admin_request_post()
1769 if (mrioc->pci_err_recovery) { in mpi3mr_admin_request_post()
1770 ioc_err(mrioc, "admin request queue submission failed due to pci error recovery in progress\n"); in mpi3mr_admin_request_post()
1775 areq_entry = (u8 *)mrioc->admin_req_base + in mpi3mr_admin_request_post()
1782 mrioc->admin_req_pi = areq_pi; in mpi3mr_admin_request_post()
1784 writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi); in mpi3mr_admin_request_post()
1787 spin_unlock_irqrestore(&mrioc->admin_req_lock, flags); in mpi3mr_admin_request_post()
1801 static void mpi3mr_free_op_req_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx) in mpi3mr_free_op_req_q_segments() argument
1807 segments = mrioc->req_qinfo[q_idx].q_segments; in mpi3mr_free_op_req_q_segments()
1811 if (mrioc->enable_segqueue) { in mpi3mr_free_op_req_q_segments()
1813 if (mrioc->req_qinfo[q_idx].q_segment_list) { in mpi3mr_free_op_req_q_segments()
1814 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_req_q_segments()
1816 mrioc->req_qinfo[q_idx].q_segment_list, in mpi3mr_free_op_req_q_segments()
1817 mrioc->req_qinfo[q_idx].q_segment_list_dma); in mpi3mr_free_op_req_q_segments()
1818 mrioc->req_qinfo[q_idx].q_segment_list = NULL; in mpi3mr_free_op_req_q_segments()
1821 size = mrioc->req_qinfo[q_idx].segment_qd * in mpi3mr_free_op_req_q_segments()
1822 mrioc->facts.op_req_sz; in mpi3mr_free_op_req_q_segments()
1824 for (j = 0; j < mrioc->req_qinfo[q_idx].num_segments; j++) { in mpi3mr_free_op_req_q_segments()
1827 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_req_q_segments()
1831 kfree(mrioc->req_qinfo[q_idx].q_segments); in mpi3mr_free_op_req_q_segments()
1832 mrioc->req_qinfo[q_idx].q_segments = NULL; in mpi3mr_free_op_req_q_segments()
1833 mrioc->req_qinfo[q_idx].qid = 0; in mpi3mr_free_op_req_q_segments()
1845 static void mpi3mr_free_op_reply_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx) in mpi3mr_free_op_reply_q_segments() argument
1851 segments = mrioc->op_reply_qinfo[q_idx].q_segments; in mpi3mr_free_op_reply_q_segments()
1855 if (mrioc->enable_segqueue) { in mpi3mr_free_op_reply_q_segments()
1857 if (mrioc->op_reply_qinfo[q_idx].q_segment_list) { in mpi3mr_free_op_reply_q_segments()
1858 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_reply_q_segments()
1860 mrioc->op_reply_qinfo[q_idx].q_segment_list, in mpi3mr_free_op_reply_q_segments()
1861 mrioc->op_reply_qinfo[q_idx].q_segment_list_dma); in mpi3mr_free_op_reply_q_segments()
1862 mrioc->op_reply_qinfo[q_idx].q_segment_list = NULL; in mpi3mr_free_op_reply_q_segments()
1865 size = mrioc->op_reply_qinfo[q_idx].segment_qd * in mpi3mr_free_op_reply_q_segments()
1866 mrioc->op_reply_desc_sz; in mpi3mr_free_op_reply_q_segments()
1868 for (j = 0; j < mrioc->op_reply_qinfo[q_idx].num_segments; j++) { in mpi3mr_free_op_reply_q_segments()
1871 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_op_reply_q_segments()
1876 kfree(mrioc->op_reply_qinfo[q_idx].q_segments); in mpi3mr_free_op_reply_q_segments()
1877 mrioc->op_reply_qinfo[q_idx].q_segments = NULL; in mpi3mr_free_op_reply_q_segments()
1878 mrioc->op_reply_qinfo[q_idx].qid = 0; in mpi3mr_free_op_reply_q_segments()
1891 static int mpi3mr_delete_op_reply_q(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_delete_op_reply_q() argument
1894 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_delete_op_reply_q()
1900 midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, mrioc->op_reply_q_offset); in mpi3mr_delete_op_reply_q()
1904 ioc_err(mrioc, "Issue DelRepQ: called with invalid ReqQID\n"); in mpi3mr_delete_op_reply_q()
1908 (op_reply_q->qtype == MPI3MR_DEFAULT_QUEUE) ? mrioc->default_qcount-- : in mpi3mr_delete_op_reply_q()
1909 mrioc->active_poll_qcount--; in mpi3mr_delete_op_reply_q()
1912 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1913 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_delete_op_reply_q()
1915 ioc_err(mrioc, "Issue DelRepQ: Init command is in use\n"); in mpi3mr_delete_op_reply_q()
1916 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1919 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_delete_op_reply_q()
1920 mrioc->init_cmds.is_waiting = 1; in mpi3mr_delete_op_reply_q()
1921 mrioc->init_cmds.callback = NULL; in mpi3mr_delete_op_reply_q()
1926 init_completion(&mrioc->init_cmds.done); in mpi3mr_delete_op_reply_q()
1927 retval = mpi3mr_admin_request_post(mrioc, &delq_req, sizeof(delq_req), in mpi3mr_delete_op_reply_q()
1930 ioc_err(mrioc, "Issue DelRepQ: Admin Post failed\n"); in mpi3mr_delete_op_reply_q()
1933 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_delete_op_reply_q()
1935 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_delete_op_reply_q()
1936 ioc_err(mrioc, "delete reply queue timed out\n"); in mpi3mr_delete_op_reply_q()
1937 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_delete_op_reply_q()
1942 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_delete_op_reply_q()
1944 ioc_err(mrioc, in mpi3mr_delete_op_reply_q()
1946 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_delete_op_reply_q()
1947 mrioc->init_cmds.ioc_loginfo); in mpi3mr_delete_op_reply_q()
1951 mrioc->intr_info[midx].op_reply_q = NULL; in mpi3mr_delete_op_reply_q()
1953 mpi3mr_free_op_reply_q_segments(mrioc, qidx); in mpi3mr_delete_op_reply_q()
1955 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_delete_op_reply_q()
1956 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_delete_op_reply_q()
1972 static int mpi3mr_alloc_op_reply_q_segments(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_alloc_op_reply_q_segments() argument
1974 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_alloc_op_reply_q_segments()
1979 if (mrioc->enable_segqueue) { in mpi3mr_alloc_op_reply_q_segments()
1981 MPI3MR_OP_REP_Q_SEG_SIZE / mrioc->op_reply_desc_sz; in mpi3mr_alloc_op_reply_q_segments()
1985 op_reply_q->q_segment_list = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_reply_q_segments()
1993 size = op_reply_q->num_replies * mrioc->op_reply_desc_sz; in mpi3mr_alloc_op_reply_q_segments()
2007 dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_reply_q_segments()
2011 if (mrioc->enable_segqueue) in mpi3mr_alloc_op_reply_q_segments()
2029 static int mpi3mr_alloc_op_req_q_segments(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_alloc_op_req_q_segments() argument
2031 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + qidx; in mpi3mr_alloc_op_req_q_segments()
2036 if (mrioc->enable_segqueue) { in mpi3mr_alloc_op_req_q_segments()
2038 MPI3MR_OP_REQ_Q_SEG_SIZE / mrioc->facts.op_req_sz; in mpi3mr_alloc_op_req_q_segments()
2042 op_req_q->q_segment_list = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_req_q_segments()
2051 size = op_req_q->num_requests * mrioc->facts.op_req_sz; in mpi3mr_alloc_op_req_q_segments()
2065 dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_alloc_op_req_q_segments()
2069 if (mrioc->enable_segqueue) in mpi3mr_alloc_op_req_q_segments()
2087 static int mpi3mr_create_op_reply_q(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_create_op_reply_q() argument
2090 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_create_op_reply_q()
2096 midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, mrioc->op_reply_q_offset); in mpi3mr_create_op_reply_q()
2100 ioc_err(mrioc, "CreateRepQ: called for duplicate qid %d\n", in mpi3mr_create_op_reply_q()
2108 if ((mrioc->pdev->device == MPI3_MFGPAGE_DEVID_SAS4116) && in mpi3mr_create_op_reply_q()
2109 !mrioc->pdev->revision) in mpi3mr_create_op_reply_q()
2118 retval = mpi3mr_alloc_op_reply_q_segments(mrioc, qidx); in mpi3mr_create_op_reply_q()
2120 mpi3mr_free_op_reply_q_segments(mrioc, qidx); in mpi3mr_create_op_reply_q()
2126 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_reply_q()
2127 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_create_op_reply_q()
2129 ioc_err(mrioc, "CreateRepQ: Init command is in use\n"); in mpi3mr_create_op_reply_q()
2132 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_create_op_reply_q()
2133 mrioc->init_cmds.is_waiting = 1; in mpi3mr_create_op_reply_q()
2134 mrioc->init_cmds.callback = NULL; in mpi3mr_create_op_reply_q()
2139 if (midx < (mrioc->intr_info_count - mrioc->requested_poll_qcount)) in mpi3mr_create_op_reply_q()
2148 cpu_to_le16(mrioc->intr_info[midx].msix_index); in mpi3mr_create_op_reply_q()
2150 create_req.msix_index = cpu_to_le16(mrioc->intr_info_count - 1); in mpi3mr_create_op_reply_q()
2151 ioc_info(mrioc, "create reply queue(polled): for qid(%d), midx(%d)\n", in mpi3mr_create_op_reply_q()
2153 if (!mrioc->active_poll_qcount) in mpi3mr_create_op_reply_q()
2154 disable_irq_nosync(pci_irq_vector(mrioc->pdev, in mpi3mr_create_op_reply_q()
2155 mrioc->intr_info_count - 1)); in mpi3mr_create_op_reply_q()
2158 if (mrioc->enable_segqueue) { in mpi3mr_create_op_reply_q()
2169 init_completion(&mrioc->init_cmds.done); in mpi3mr_create_op_reply_q()
2170 retval = mpi3mr_admin_request_post(mrioc, &create_req, in mpi3mr_create_op_reply_q()
2173 ioc_err(mrioc, "CreateRepQ: Admin Post failed\n"); in mpi3mr_create_op_reply_q()
2176 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_create_op_reply_q()
2178 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_create_op_reply_q()
2179 ioc_err(mrioc, "create reply queue timed out\n"); in mpi3mr_create_op_reply_q()
2180 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_create_op_reply_q()
2185 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_create_op_reply_q()
2187 ioc_err(mrioc, in mpi3mr_create_op_reply_q()
2189 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_create_op_reply_q()
2190 mrioc->init_cmds.ioc_loginfo); in mpi3mr_create_op_reply_q()
2195 if (midx < mrioc->intr_info_count) in mpi3mr_create_op_reply_q()
2196 mrioc->intr_info[midx].op_reply_q = op_reply_q; in mpi3mr_create_op_reply_q()
2198 (op_reply_q->qtype == MPI3MR_DEFAULT_QUEUE) ? mrioc->default_qcount++ : in mpi3mr_create_op_reply_q()
2199 mrioc->active_poll_qcount++; in mpi3mr_create_op_reply_q()
2202 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_create_op_reply_q()
2203 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_reply_q()
2220 static int mpi3mr_create_op_req_q(struct mpi3mr_ioc *mrioc, u16 idx, in mpi3mr_create_op_req_q() argument
2224 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + idx; in mpi3mr_create_op_req_q()
2232 ioc_err(mrioc, "CreateReqQ: called for duplicate qid %d\n", in mpi3mr_create_op_req_q()
2246 retval = mpi3mr_alloc_op_req_q_segments(mrioc, idx); in mpi3mr_create_op_req_q()
2248 mpi3mr_free_op_req_q_segments(mrioc, idx); in mpi3mr_create_op_req_q()
2254 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_req_q()
2255 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_create_op_req_q()
2257 ioc_err(mrioc, "CreateReqQ: Init command is in use\n"); in mpi3mr_create_op_req_q()
2260 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_create_op_req_q()
2261 mrioc->init_cmds.is_waiting = 1; in mpi3mr_create_op_req_q()
2262 mrioc->init_cmds.callback = NULL; in mpi3mr_create_op_req_q()
2266 if (mrioc->enable_segqueue) { in mpi3mr_create_op_req_q()
2277 init_completion(&mrioc->init_cmds.done); in mpi3mr_create_op_req_q()
2278 retval = mpi3mr_admin_request_post(mrioc, &create_req, in mpi3mr_create_op_req_q()
2281 ioc_err(mrioc, "CreateReqQ: Admin Post failed\n"); in mpi3mr_create_op_req_q()
2284 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_create_op_req_q()
2286 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_create_op_req_q()
2287 ioc_err(mrioc, "create request queue timed out\n"); in mpi3mr_create_op_req_q()
2288 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_create_op_req_q()
2293 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_create_op_req_q()
2295 ioc_err(mrioc, in mpi3mr_create_op_req_q()
2297 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_create_op_req_q()
2298 mrioc->init_cmds.ioc_loginfo); in mpi3mr_create_op_req_q()
2305 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_create_op_req_q()
2306 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_create_op_req_q()
2321 static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc) in mpi3mr_create_op_queues() argument
2326 num_queues = min_t(int, mrioc->facts.max_op_reply_q, in mpi3mr_create_op_queues()
2327 mrioc->facts.max_op_req_q); in mpi3mr_create_op_queues()
2330 mrioc->intr_info_count - mrioc->op_reply_q_offset; in mpi3mr_create_op_queues()
2331 if (!mrioc->num_queues) in mpi3mr_create_op_queues()
2332 mrioc->num_queues = min_t(int, num_queues, msix_count_op_q); in mpi3mr_create_op_queues()
2337 num_queues = mrioc->num_op_reply_q ? in mpi3mr_create_op_queues()
2338 mrioc->num_op_reply_q : mrioc->num_queues; in mpi3mr_create_op_queues()
2339 ioc_info(mrioc, "trying to create %d operational queue pairs\n", in mpi3mr_create_op_queues()
2342 if (!mrioc->req_qinfo) { in mpi3mr_create_op_queues()
2343 mrioc->req_qinfo = kcalloc(num_queues, in mpi3mr_create_op_queues()
2345 if (!mrioc->req_qinfo) { in mpi3mr_create_op_queues()
2350 mrioc->op_reply_qinfo = kzalloc(sizeof(struct op_reply_qinfo) * in mpi3mr_create_op_queues()
2352 if (!mrioc->op_reply_qinfo) { in mpi3mr_create_op_queues()
2358 if (mrioc->enable_segqueue) in mpi3mr_create_op_queues()
2359 ioc_info(mrioc, in mpi3mr_create_op_queues()
2363 if (mpi3mr_create_op_reply_q(mrioc, i)) { in mpi3mr_create_op_queues()
2364 ioc_err(mrioc, "Cannot create OP RepQ %d\n", i); in mpi3mr_create_op_queues()
2367 if (mpi3mr_create_op_req_q(mrioc, i, in mpi3mr_create_op_queues()
2368 mrioc->op_reply_qinfo[i].qid)) { in mpi3mr_create_op_queues()
2369 ioc_err(mrioc, "Cannot create OP ReqQ %d\n", i); in mpi3mr_create_op_queues()
2370 mpi3mr_delete_op_reply_q(mrioc, i); in mpi3mr_create_op_queues()
2380 mrioc->num_op_reply_q = mrioc->num_op_req_q = i; in mpi3mr_create_op_queues()
2381 ioc_info(mrioc, in mpi3mr_create_op_queues()
2383 mrioc->num_op_reply_q, mrioc->default_qcount, in mpi3mr_create_op_queues()
2384 mrioc->active_poll_qcount); in mpi3mr_create_op_queues()
2388 kfree(mrioc->req_qinfo); in mpi3mr_create_op_queues()
2389 mrioc->req_qinfo = NULL; in mpi3mr_create_op_queues()
2391 kfree(mrioc->op_reply_qinfo); in mpi3mr_create_op_queues()
2392 mrioc->op_reply_qinfo = NULL; in mpi3mr_create_op_queues()
2409 int mpi3mr_op_request_post(struct mpi3mr_ioc *mrioc, in mpi3mr_op_request_post() argument
2417 u16 req_sz = mrioc->facts.op_req_sz; in mpi3mr_op_request_post()
2422 if (mrioc->unrecoverable) in mpi3mr_op_request_post()
2431 reply_qidx, mrioc->op_reply_q_offset); in mpi3mr_op_request_post()
2432 mpi3mr_process_op_reply_q(mrioc, mrioc->intr_info[midx].op_reply_q); in mpi3mr_op_request_post()
2440 if (mrioc->reset_in_progress) { in mpi3mr_op_request_post()
2441 ioc_err(mrioc, "OpReqQ submit reset in progress\n"); in mpi3mr_op_request_post()
2445 if (mrioc->pci_err_recovery) { in mpi3mr_op_request_post()
2446 …ioc_err(mrioc, "operational request queue submission failed due to pci error recovery in progress\… in mpi3mr_op_request_post()
2463 if (atomic_inc_return(&mrioc->op_reply_qinfo[reply_qidx].pend_ios) in mpi3mr_op_request_post()
2465 mrioc->op_reply_qinfo[reply_qidx].enable_irq_poll = true; in mpi3mr_op_request_post()
2467 atomic_inc_return(&mrioc->op_reply_qinfo[reply_qidx].pend_ios); in mpi3mr_op_request_post()
2471 &mrioc->sysif_regs->oper_queue_indexes[reply_qidx].producer_index); in mpi3mr_op_request_post()
2492 void mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code) in mpi3mr_check_rh_fault_ioc() argument
2497 if (mrioc->unrecoverable) { in mpi3mr_check_rh_fault_ioc()
2498 ioc_err(mrioc, "controller is unrecoverable\n"); in mpi3mr_check_rh_fault_ioc()
2502 if (!pci_device_is_present(mrioc->pdev)) { in mpi3mr_check_rh_fault_ioc()
2503 mrioc->unrecoverable = 1; in mpi3mr_check_rh_fault_ioc()
2504 ioc_err(mrioc, "controller is not present\n"); in mpi3mr_check_rh_fault_ioc()
2508 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_check_rh_fault_ioc()
2511 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_check_rh_fault_ioc()
2515 trigger_data.fault = (readl(&mrioc->sysif_regs->fault) & in mpi3mr_check_rh_fault_ioc()
2518 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_check_rh_fault_ioc()
2520 mpi3mr_print_fault_info(mrioc); in mpi3mr_check_rh_fault_ioc()
2524 mpi3mr_set_diagsave(mrioc); in mpi3mr_check_rh_fault_ioc()
2525 mpi3mr_issue_reset(mrioc, MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, in mpi3mr_check_rh_fault_ioc()
2527 trigger_data.fault = (readl(&mrioc->sysif_regs->fault) & in mpi3mr_check_rh_fault_ioc()
2529 mpi3mr_set_trigger_data_in_all_hdb(mrioc, MPI3MR_HDB_TRIGGER_TYPE_FAULT, in mpi3mr_check_rh_fault_ioc()
2533 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_check_rh_fault_ioc()
2549 static int mpi3mr_sync_timestamp(struct mpi3mr_ioc *mrioc) in mpi3mr_sync_timestamp() argument
2556 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2557 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_sync_timestamp()
2559 ioc_err(mrioc, "Issue IOUCTL time_stamp: command is in use\n"); in mpi3mr_sync_timestamp()
2560 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2563 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_sync_timestamp()
2564 mrioc->init_cmds.is_waiting = 1; in mpi3mr_sync_timestamp()
2565 mrioc->init_cmds.callback = NULL; in mpi3mr_sync_timestamp()
2572 init_completion(&mrioc->init_cmds.done); in mpi3mr_sync_timestamp()
2573 retval = mpi3mr_admin_request_post(mrioc, &iou_ctrl, in mpi3mr_sync_timestamp()
2576 ioc_err(mrioc, "Issue IOUCTL time_stamp: Admin Post failed\n"); in mpi3mr_sync_timestamp()
2580 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_sync_timestamp()
2582 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_sync_timestamp()
2583 ioc_err(mrioc, "Issue IOUCTL time_stamp: command timed out\n"); in mpi3mr_sync_timestamp()
2584 mrioc->init_cmds.is_waiting = 0; in mpi3mr_sync_timestamp()
2585 if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET)) in mpi3mr_sync_timestamp()
2586 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_sync_timestamp()
2591 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_sync_timestamp()
2593 ioc_err(mrioc, in mpi3mr_sync_timestamp()
2595 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_sync_timestamp()
2596 mrioc->init_cmds.ioc_loginfo); in mpi3mr_sync_timestamp()
2602 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_sync_timestamp()
2603 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_sync_timestamp()
2618 static int mpi3mr_print_pkg_ver(struct mpi3mr_ioc *mrioc) in mpi3mr_print_pkg_ver() argument
2628 data = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_print_pkg_ver()
2634 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2635 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_print_pkg_ver()
2636 ioc_err(mrioc, "sending get package version failed due to command in use\n"); in mpi3mr_print_pkg_ver()
2637 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2640 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_print_pkg_ver()
2641 mrioc->init_cmds.is_waiting = 1; in mpi3mr_print_pkg_ver()
2642 mrioc->init_cmds.callback = NULL; in mpi3mr_print_pkg_ver()
2652 init_completion(&mrioc->init_cmds.done); in mpi3mr_print_pkg_ver()
2653 retval = mpi3mr_admin_request_post(mrioc, &ci_upload, in mpi3mr_print_pkg_ver()
2656 ioc_err(mrioc, "posting get package version failed\n"); in mpi3mr_print_pkg_ver()
2659 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_print_pkg_ver()
2661 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_print_pkg_ver()
2662 ioc_err(mrioc, "get package version timed out\n"); in mpi3mr_print_pkg_ver()
2663 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_print_pkg_ver()
2668 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_print_pkg_ver()
2672 ioc_info(mrioc, in mpi3mr_print_pkg_ver()
2684 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_print_pkg_ver()
2685 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_print_pkg_ver()
2689 dma_free_coherent(&mrioc->pdev->dev, data_len, data, in mpi3mr_print_pkg_ver()
2706 struct mpi3mr_ioc *mrioc = in mpi3mr_watchdog_work() local
2714 if (mrioc->reset_in_progress || mrioc->pci_err_recovery) in mpi3mr_watchdog_work()
2717 if (!mrioc->unrecoverable && !pci_device_is_present(mrioc->pdev)) { in mpi3mr_watchdog_work()
2718 ioc_err(mrioc, "watchdog could not detect the controller\n"); in mpi3mr_watchdog_work()
2719 mrioc->unrecoverable = 1; in mpi3mr_watchdog_work()
2722 if (mrioc->unrecoverable) { in mpi3mr_watchdog_work()
2723 ioc_err(mrioc, in mpi3mr_watchdog_work()
2725 mpi3mr_flush_cmds_for_unrecovered_controller(mrioc); in mpi3mr_watchdog_work()
2729 if (mrioc->ts_update_counter++ >= mrioc->ts_update_interval) { in mpi3mr_watchdog_work()
2730 mrioc->ts_update_counter = 0; in mpi3mr_watchdog_work()
2731 mpi3mr_sync_timestamp(mrioc); in mpi3mr_watchdog_work()
2734 if ((mrioc->prepare_for_reset) && in mpi3mr_watchdog_work()
2735 ((mrioc->prepare_for_reset_timeout_counter++) >= in mpi3mr_watchdog_work()
2737 mpi3mr_soft_reset_handler(mrioc, in mpi3mr_watchdog_work()
2743 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_watchdog_work()
2745 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_watchdog_work()
2747 mpi3mr_soft_reset_handler(mrioc, MPI3MR_RESET_FROM_FIRMWARE, 0); in mpi3mr_watchdog_work()
2752 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_watchdog_work()
2756 trigger_data.fault = readl(&mrioc->sysif_regs->fault) & MPI3_SYSIF_FAULT_CODE_MASK; in mpi3mr_watchdog_work()
2757 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_watchdog_work()
2759 host_diagnostic = readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_watchdog_work()
2761 if (!mrioc->diagsave_timeout) { in mpi3mr_watchdog_work()
2762 mpi3mr_print_fault_info(mrioc); in mpi3mr_watchdog_work()
2763 ioc_warn(mrioc, "diag save in progress\n"); in mpi3mr_watchdog_work()
2765 if ((mrioc->diagsave_timeout++) <= MPI3_SYSIF_DIAG_SAVE_TIMEOUT) in mpi3mr_watchdog_work()
2769 mpi3mr_print_fault_info(mrioc); in mpi3mr_watchdog_work()
2770 mrioc->diagsave_timeout = 0; in mpi3mr_watchdog_work()
2772 if (!mpi3mr_is_fault_recoverable(mrioc)) { in mpi3mr_watchdog_work()
2773 mrioc->unrecoverable = 1; in mpi3mr_watchdog_work()
2780 ioc_warn(mrioc, in mpi3mr_watchdog_work()
2782 mrioc->unrecoverable = 1; in mpi3mr_watchdog_work()
2792 mpi3mr_soft_reset_handler(mrioc, reset_reason, 0); in mpi3mr_watchdog_work()
2796 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_watchdog_work()
2797 if (mrioc->watchdog_work_q) in mpi3mr_watchdog_work()
2798 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_watchdog_work()
2799 &mrioc->watchdog_work, in mpi3mr_watchdog_work()
2801 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_watchdog_work()
2814 void mpi3mr_start_watchdog(struct mpi3mr_ioc *mrioc) in mpi3mr_start_watchdog() argument
2816 if (mrioc->watchdog_work_q) in mpi3mr_start_watchdog()
2819 INIT_DELAYED_WORK(&mrioc->watchdog_work, mpi3mr_watchdog_work); in mpi3mr_start_watchdog()
2820 snprintf(mrioc->watchdog_work_q_name, in mpi3mr_start_watchdog()
2821 sizeof(mrioc->watchdog_work_q_name), "watchdog_%s%d", mrioc->name, in mpi3mr_start_watchdog()
2822 mrioc->id); in mpi3mr_start_watchdog()
2823 mrioc->watchdog_work_q = alloc_ordered_workqueue( in mpi3mr_start_watchdog()
2824 "%s", WQ_MEM_RECLAIM, mrioc->watchdog_work_q_name); in mpi3mr_start_watchdog()
2825 if (!mrioc->watchdog_work_q) { in mpi3mr_start_watchdog()
2826 ioc_err(mrioc, "%s: failed (line=%d)\n", __func__, __LINE__); in mpi3mr_start_watchdog()
2830 if (mrioc->watchdog_work_q) in mpi3mr_start_watchdog()
2831 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_start_watchdog()
2832 &mrioc->watchdog_work, in mpi3mr_start_watchdog()
2845 void mpi3mr_stop_watchdog(struct mpi3mr_ioc *mrioc) in mpi3mr_stop_watchdog() argument
2850 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_stop_watchdog()
2851 wq = mrioc->watchdog_work_q; in mpi3mr_stop_watchdog()
2852 mrioc->watchdog_work_q = NULL; in mpi3mr_stop_watchdog()
2853 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_stop_watchdog()
2855 if (!cancel_delayed_work_sync(&mrioc->watchdog_work)) in mpi3mr_stop_watchdog()
2870 static int mpi3mr_setup_admin_qpair(struct mpi3mr_ioc *mrioc) in mpi3mr_setup_admin_qpair() argument
2875 mrioc->admin_req_q_sz = MPI3MR_ADMIN_REQ_Q_SIZE; in mpi3mr_setup_admin_qpair()
2876 mrioc->num_admin_req = mrioc->admin_req_q_sz / in mpi3mr_setup_admin_qpair()
2878 mrioc->admin_req_ci = mrioc->admin_req_pi = 0; in mpi3mr_setup_admin_qpair()
2880 mrioc->admin_reply_q_sz = MPI3MR_ADMIN_REPLY_Q_SIZE; in mpi3mr_setup_admin_qpair()
2881 mrioc->num_admin_replies = mrioc->admin_reply_q_sz / in mpi3mr_setup_admin_qpair()
2883 mrioc->admin_reply_ci = 0; in mpi3mr_setup_admin_qpair()
2884 mrioc->admin_reply_ephase = 1; in mpi3mr_setup_admin_qpair()
2885 atomic_set(&mrioc->admin_reply_q_in_use, 0); in mpi3mr_setup_admin_qpair()
2887 if (!mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2888 mrioc->admin_req_base = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_setup_admin_qpair()
2889 mrioc->admin_req_q_sz, &mrioc->admin_req_dma, GFP_KERNEL); in mpi3mr_setup_admin_qpair()
2891 if (!mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2896 mrioc->admin_reply_base = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_setup_admin_qpair()
2897 mrioc->admin_reply_q_sz, &mrioc->admin_reply_dma, in mpi3mr_setup_admin_qpair()
2900 if (!mrioc->admin_reply_base) { in mpi3mr_setup_admin_qpair()
2906 num_admin_entries = (mrioc->num_admin_replies << 16) | in mpi3mr_setup_admin_qpair()
2907 (mrioc->num_admin_req); in mpi3mr_setup_admin_qpair()
2908 writel(num_admin_entries, &mrioc->sysif_regs->admin_queue_num_entries); in mpi3mr_setup_admin_qpair()
2909 mpi3mr_writeq(mrioc->admin_req_dma, in mpi3mr_setup_admin_qpair()
2910 &mrioc->sysif_regs->admin_request_queue_address); in mpi3mr_setup_admin_qpair()
2911 mpi3mr_writeq(mrioc->admin_reply_dma, in mpi3mr_setup_admin_qpair()
2912 &mrioc->sysif_regs->admin_reply_queue_address); in mpi3mr_setup_admin_qpair()
2913 writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi); in mpi3mr_setup_admin_qpair()
2914 writel(mrioc->admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci); in mpi3mr_setup_admin_qpair()
2919 if (mrioc->admin_reply_base) { in mpi3mr_setup_admin_qpair()
2920 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_reply_q_sz, in mpi3mr_setup_admin_qpair()
2921 mrioc->admin_reply_base, mrioc->admin_reply_dma); in mpi3mr_setup_admin_qpair()
2922 mrioc->admin_reply_base = NULL; in mpi3mr_setup_admin_qpair()
2924 if (mrioc->admin_req_base) { in mpi3mr_setup_admin_qpair()
2925 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_req_q_sz, in mpi3mr_setup_admin_qpair()
2926 mrioc->admin_req_base, mrioc->admin_req_dma); in mpi3mr_setup_admin_qpair()
2927 mrioc->admin_req_base = NULL; in mpi3mr_setup_admin_qpair()
2942 static int mpi3mr_issue_iocfacts(struct mpi3mr_ioc *mrioc, in mpi3mr_issue_iocfacts() argument
2952 data = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_issue_iocfacts()
2961 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
2962 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_iocfacts()
2964 ioc_err(mrioc, "Issue IOCFacts: Init command is in use\n"); in mpi3mr_issue_iocfacts()
2965 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
2968 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_iocfacts()
2969 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_iocfacts()
2970 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_iocfacts()
2977 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_iocfacts()
2978 retval = mpi3mr_admin_request_post(mrioc, &iocfacts_req, in mpi3mr_issue_iocfacts()
2981 ioc_err(mrioc, "Issue IOCFacts: Admin Post failed\n"); in mpi3mr_issue_iocfacts()
2984 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_iocfacts()
2986 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_iocfacts()
2987 ioc_err(mrioc, "ioc_facts timed out\n"); in mpi3mr_issue_iocfacts()
2988 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_issue_iocfacts()
2993 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_iocfacts()
2995 ioc_err(mrioc, in mpi3mr_issue_iocfacts()
2997 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_iocfacts()
2998 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_iocfacts()
3003 mpi3mr_process_factsdata(mrioc, facts_data); in mpi3mr_issue_iocfacts()
3005 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_iocfacts()
3006 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocfacts()
3010 dma_free_coherent(&mrioc->pdev->dev, data_len, data, data_dma); in mpi3mr_issue_iocfacts()
3024 static inline int mpi3mr_check_reset_dma_mask(struct mpi3mr_ioc *mrioc) in mpi3mr_check_reset_dma_mask() argument
3026 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_check_reset_dma_mask()
3028 u64 facts_dma_mask = DMA_BIT_MASK(mrioc->facts.dma_mask); in mpi3mr_check_reset_dma_mask()
3030 if (!mrioc->facts.dma_mask || (mrioc->dma_mask <= facts_dma_mask)) in mpi3mr_check_reset_dma_mask()
3033 ioc_info(mrioc, "Changing DMA mask from 0x%016llx to 0x%016llx\n", in mpi3mr_check_reset_dma_mask()
3034 mrioc->dma_mask, facts_dma_mask); in mpi3mr_check_reset_dma_mask()
3038 ioc_err(mrioc, "Setting DMA mask to 0x%016llx failed: %d\n", in mpi3mr_check_reset_dma_mask()
3042 mrioc->dma_mask = facts_dma_mask; in mpi3mr_check_reset_dma_mask()
3056 static void mpi3mr_process_factsdata(struct mpi3mr_ioc *mrioc, in mpi3mr_process_factsdata() argument
3063 ioc_warn(mrioc, in mpi3mr_process_factsdata()
3069 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_process_factsdata()
3073 ioc_err(mrioc, in mpi3mr_process_factsdata()
3078 memset(&mrioc->facts, 0, sizeof(mrioc->facts)); in mpi3mr_process_factsdata()
3081 mrioc->facts.op_req_sz = req_sz; in mpi3mr_process_factsdata()
3082 mrioc->op_reply_desc_sz = 1 << ((ioc_config & in mpi3mr_process_factsdata()
3086 mrioc->facts.ioc_num = facts_data->ioc_number; in mpi3mr_process_factsdata()
3087 mrioc->facts.who_init = facts_data->who_init; in mpi3mr_process_factsdata()
3088 mrioc->facts.max_msix_vectors = le16_to_cpu(facts_data->max_msix_vectors); in mpi3mr_process_factsdata()
3089 mrioc->facts.personality = (facts_flags & in mpi3mr_process_factsdata()
3091 mrioc->facts.dma_mask = (facts_flags & in mpi3mr_process_factsdata()
3094 mrioc->facts.protocol_flags = facts_data->protocol_flags; in mpi3mr_process_factsdata()
3095 mrioc->facts.mpi_version = le32_to_cpu(facts_data->mpi_version.word); in mpi3mr_process_factsdata()
3096 mrioc->facts.max_reqs = le16_to_cpu(facts_data->max_outstanding_requests); in mpi3mr_process_factsdata()
3097 mrioc->facts.product_id = le16_to_cpu(facts_data->product_id); in mpi3mr_process_factsdata()
3098 mrioc->facts.reply_sz = le16_to_cpu(facts_data->reply_frame_size) * 4; in mpi3mr_process_factsdata()
3099 mrioc->facts.exceptions = le16_to_cpu(facts_data->ioc_exceptions); in mpi3mr_process_factsdata()
3100 mrioc->facts.max_perids = le16_to_cpu(facts_data->max_persistent_id); in mpi3mr_process_factsdata()
3101 mrioc->facts.max_vds = le16_to_cpu(facts_data->max_vds); in mpi3mr_process_factsdata()
3102 mrioc->facts.max_hpds = le16_to_cpu(facts_data->max_host_pds); in mpi3mr_process_factsdata()
3103 mrioc->facts.max_advhpds = le16_to_cpu(facts_data->max_adv_host_pds); in mpi3mr_process_factsdata()
3104 mrioc->facts.max_raid_pds = le16_to_cpu(facts_data->max_raid_pds); in mpi3mr_process_factsdata()
3105 mrioc->facts.max_nvme = le16_to_cpu(facts_data->max_nvme); in mpi3mr_process_factsdata()
3106 mrioc->facts.max_pcie_switches = in mpi3mr_process_factsdata()
3108 mrioc->facts.max_sasexpanders = in mpi3mr_process_factsdata()
3110 mrioc->facts.max_data_length = le16_to_cpu(facts_data->max_data_length); in mpi3mr_process_factsdata()
3111 mrioc->facts.max_sasinitiators = in mpi3mr_process_factsdata()
3113 mrioc->facts.max_enclosures = le16_to_cpu(facts_data->max_enclosures); in mpi3mr_process_factsdata()
3114 mrioc->facts.min_devhandle = le16_to_cpu(facts_data->min_dev_handle); in mpi3mr_process_factsdata()
3115 mrioc->facts.max_devhandle = le16_to_cpu(facts_data->max_dev_handle); in mpi3mr_process_factsdata()
3116 mrioc->facts.max_op_req_q = in mpi3mr_process_factsdata()
3118 mrioc->facts.max_op_reply_q = in mpi3mr_process_factsdata()
3120 mrioc->facts.ioc_capabilities = in mpi3mr_process_factsdata()
3122 mrioc->facts.fw_ver.build_num = in mpi3mr_process_factsdata()
3124 mrioc->facts.fw_ver.cust_id = in mpi3mr_process_factsdata()
3126 mrioc->facts.fw_ver.ph_minor = facts_data->fw_version.phase_minor; in mpi3mr_process_factsdata()
3127 mrioc->facts.fw_ver.ph_major = facts_data->fw_version.phase_major; in mpi3mr_process_factsdata()
3128 mrioc->facts.fw_ver.gen_minor = facts_data->fw_version.gen_minor; in mpi3mr_process_factsdata()
3129 mrioc->facts.fw_ver.gen_major = facts_data->fw_version.gen_major; in mpi3mr_process_factsdata()
3130 mrioc->msix_count = min_t(int, mrioc->msix_count, in mpi3mr_process_factsdata()
3131 mrioc->facts.max_msix_vectors); in mpi3mr_process_factsdata()
3132 mrioc->facts.sge_mod_mask = facts_data->sge_modifier_mask; in mpi3mr_process_factsdata()
3133 mrioc->facts.sge_mod_value = facts_data->sge_modifier_value; in mpi3mr_process_factsdata()
3134 mrioc->facts.sge_mod_shift = facts_data->sge_modifier_shift; in mpi3mr_process_factsdata()
3135 mrioc->facts.shutdown_timeout = in mpi3mr_process_factsdata()
3137 mrioc->facts.diag_trace_sz = in mpi3mr_process_factsdata()
3139 mrioc->facts.diag_fw_sz = in mpi3mr_process_factsdata()
3141 mrioc->facts.diag_drvr_sz = le32_to_cpu(facts_data->diag_driver_size); in mpi3mr_process_factsdata()
3142 mrioc->facts.max_dev_per_tg = in mpi3mr_process_factsdata()
3144 mrioc->facts.io_throttle_data_length = in mpi3mr_process_factsdata()
3146 mrioc->facts.max_io_throttle_group = in mpi3mr_process_factsdata()
3148 mrioc->facts.io_throttle_low = le16_to_cpu(facts_data->io_throttle_low); in mpi3mr_process_factsdata()
3149 mrioc->facts.io_throttle_high = in mpi3mr_process_factsdata()
3152 if (mrioc->facts.max_data_length == in mpi3mr_process_factsdata()
3154 mrioc->facts.max_data_length = MPI3MR_DEFAULT_MAX_IO_SIZE; in mpi3mr_process_factsdata()
3156 mrioc->facts.max_data_length *= MPI3MR_PAGE_SIZE_4K; in mpi3mr_process_factsdata()
3158 if (mrioc->facts.io_throttle_data_length) in mpi3mr_process_factsdata()
3159 mrioc->io_throttle_data_length = in mpi3mr_process_factsdata()
3160 (mrioc->facts.io_throttle_data_length * 2 * 4); in mpi3mr_process_factsdata()
3163 mrioc->io_throttle_data_length = (mrioc->facts.max_data_length / 512) + 2; in mpi3mr_process_factsdata()
3165 mrioc->io_throttle_high = (mrioc->facts.io_throttle_high * 2 * 1024); in mpi3mr_process_factsdata()
3166 mrioc->io_throttle_low = (mrioc->facts.io_throttle_low * 2 * 1024); in mpi3mr_process_factsdata()
3168 ioc_info(mrioc, "ioc_num(%d), maxopQ(%d), maxopRepQ(%d), maxdh(%d),", in mpi3mr_process_factsdata()
3169 mrioc->facts.ioc_num, mrioc->facts.max_op_req_q, in mpi3mr_process_factsdata()
3170 mrioc->facts.max_op_reply_q, mrioc->facts.max_devhandle); in mpi3mr_process_factsdata()
3171 ioc_info(mrioc, in mpi3mr_process_factsdata()
3173 mrioc->facts.max_reqs, mrioc->facts.min_devhandle, in mpi3mr_process_factsdata()
3174 mrioc->facts.max_msix_vectors, mrioc->facts.max_perids); in mpi3mr_process_factsdata()
3175 ioc_info(mrioc, "SGEModMask 0x%x SGEModVal 0x%x SGEModShift 0x%x ", in mpi3mr_process_factsdata()
3176 mrioc->facts.sge_mod_mask, mrioc->facts.sge_mod_value, in mpi3mr_process_factsdata()
3177 mrioc->facts.sge_mod_shift); in mpi3mr_process_factsdata()
3178 ioc_info(mrioc, "DMA mask %d InitialPE status 0x%x max_data_len (%d)\n", in mpi3mr_process_factsdata()
3179 mrioc->facts.dma_mask, (facts_flags & in mpi3mr_process_factsdata()
3180 MPI3_IOCFACTS_FLAGS_INITIAL_PORT_ENABLE_MASK), mrioc->facts.max_data_length); in mpi3mr_process_factsdata()
3181 ioc_info(mrioc, in mpi3mr_process_factsdata()
3183 mrioc->facts.max_dev_per_tg, mrioc->facts.max_io_throttle_group); in mpi3mr_process_factsdata()
3184 ioc_info(mrioc, in mpi3mr_process_factsdata()
3186 mrioc->facts.io_throttle_data_length * 4, in mpi3mr_process_factsdata()
3187 mrioc->facts.io_throttle_high, mrioc->facts.io_throttle_low); in mpi3mr_process_factsdata()
3199 static int mpi3mr_alloc_reply_sense_bufs(struct mpi3mr_ioc *mrioc) in mpi3mr_alloc_reply_sense_bufs() argument
3204 if (mrioc->init_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3207 mrioc->init_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3208 if (!mrioc->init_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3211 mrioc->bsg_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3212 if (!mrioc->bsg_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3215 mrioc->transport_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3216 if (!mrioc->transport_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3220 mrioc->dev_rmhs_cmds[i].reply = kzalloc(mrioc->reply_sz, in mpi3mr_alloc_reply_sense_bufs()
3222 if (!mrioc->dev_rmhs_cmds[i].reply) in mpi3mr_alloc_reply_sense_bufs()
3227 mrioc->evtack_cmds[i].reply = kzalloc(mrioc->reply_sz, in mpi3mr_alloc_reply_sense_bufs()
3229 if (!mrioc->evtack_cmds[i].reply) in mpi3mr_alloc_reply_sense_bufs()
3233 mrioc->host_tm_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3234 if (!mrioc->host_tm_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3237 mrioc->pel_cmds.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3238 if (!mrioc->pel_cmds.reply) in mpi3mr_alloc_reply_sense_bufs()
3241 mrioc->pel_abort_cmd.reply = kzalloc(mrioc->reply_sz, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3242 if (!mrioc->pel_abort_cmd.reply) in mpi3mr_alloc_reply_sense_bufs()
3245 mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle; in mpi3mr_alloc_reply_sense_bufs()
3246 mrioc->removepend_bitmap = bitmap_zalloc(mrioc->dev_handle_bitmap_bits, in mpi3mr_alloc_reply_sense_bufs()
3248 if (!mrioc->removepend_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3251 mrioc->devrem_bitmap = bitmap_zalloc(MPI3MR_NUM_DEVRMCMD, GFP_KERNEL); in mpi3mr_alloc_reply_sense_bufs()
3252 if (!mrioc->devrem_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3255 mrioc->evtack_cmds_bitmap = bitmap_zalloc(MPI3MR_NUM_EVTACKCMD, in mpi3mr_alloc_reply_sense_bufs()
3257 if (!mrioc->evtack_cmds_bitmap) in mpi3mr_alloc_reply_sense_bufs()
3260 mrioc->num_reply_bufs = mrioc->facts.max_reqs + MPI3MR_NUM_EVT_REPLIES; in mpi3mr_alloc_reply_sense_bufs()
3261 mrioc->reply_free_qsz = mrioc->num_reply_bufs + 1; in mpi3mr_alloc_reply_sense_bufs()
3262 mrioc->num_sense_bufs = mrioc->facts.max_reqs / MPI3MR_SENSEBUF_FACTOR; in mpi3mr_alloc_reply_sense_bufs()
3263 mrioc->sense_buf_q_sz = mrioc->num_sense_bufs + 1; in mpi3mr_alloc_reply_sense_bufs()
3266 sz = mrioc->num_reply_bufs * mrioc->reply_sz; in mpi3mr_alloc_reply_sense_bufs()
3267 mrioc->reply_buf_pool = dma_pool_create("reply_buf pool", in mpi3mr_alloc_reply_sense_bufs()
3268 &mrioc->pdev->dev, sz, 16, 0); in mpi3mr_alloc_reply_sense_bufs()
3269 if (!mrioc->reply_buf_pool) { in mpi3mr_alloc_reply_sense_bufs()
3270 ioc_err(mrioc, "reply buf pool: dma_pool_create failed\n"); in mpi3mr_alloc_reply_sense_bufs()
3274 mrioc->reply_buf = dma_pool_zalloc(mrioc->reply_buf_pool, GFP_KERNEL, in mpi3mr_alloc_reply_sense_bufs()
3275 &mrioc->reply_buf_dma); in mpi3mr_alloc_reply_sense_bufs()
3276 if (!mrioc->reply_buf) in mpi3mr_alloc_reply_sense_bufs()
3279 mrioc->reply_buf_dma_max_address = mrioc->reply_buf_dma + sz; in mpi3mr_alloc_reply_sense_bufs()
3282 sz = mrioc->reply_free_qsz * 8; in mpi3mr_alloc_reply_sense_bufs()
3283 mrioc->reply_free_q_pool = dma_pool_create("reply_free_q pool", in mpi3mr_alloc_reply_sense_bufs()
3284 &mrioc->pdev->dev, sz, 8, 0); in mpi3mr_alloc_reply_sense_bufs()
3285 if (!mrioc->reply_free_q_pool) { in mpi3mr_alloc_reply_sense_bufs()
3286 ioc_err(mrioc, "reply_free_q pool: dma_pool_create failed\n"); in mpi3mr_alloc_reply_sense_bufs()
3289 mrioc->reply_free_q = dma_pool_zalloc(mrioc->reply_free_q_pool, in mpi3mr_alloc_reply_sense_bufs()
3290 GFP_KERNEL, &mrioc->reply_free_q_dma); in mpi3mr_alloc_reply_sense_bufs()
3291 if (!mrioc->reply_free_q) in mpi3mr_alloc_reply_sense_bufs()
3295 sz = mrioc->num_sense_bufs * MPI3MR_SENSE_BUF_SZ; in mpi3mr_alloc_reply_sense_bufs()
3296 mrioc->sense_buf_pool = dma_pool_create("sense_buf pool", in mpi3mr_alloc_reply_sense_bufs()
3297 &mrioc->pdev->dev, sz, 4, 0); in mpi3mr_alloc_reply_sense_bufs()
3298 if (!mrioc->sense_buf_pool) { in mpi3mr_alloc_reply_sense_bufs()
3299 ioc_err(mrioc, "sense_buf pool: dma_pool_create failed\n"); in mpi3mr_alloc_reply_sense_bufs()
3302 mrioc->sense_buf = dma_pool_zalloc(mrioc->sense_buf_pool, GFP_KERNEL, in mpi3mr_alloc_reply_sense_bufs()
3303 &mrioc->sense_buf_dma); in mpi3mr_alloc_reply_sense_bufs()
3304 if (!mrioc->sense_buf) in mpi3mr_alloc_reply_sense_bufs()
3308 sz = mrioc->sense_buf_q_sz * 8; in mpi3mr_alloc_reply_sense_bufs()
3309 mrioc->sense_buf_q_pool = dma_pool_create("sense_buf_q pool", in mpi3mr_alloc_reply_sense_bufs()
3310 &mrioc->pdev->dev, sz, 8, 0); in mpi3mr_alloc_reply_sense_bufs()
3311 if (!mrioc->sense_buf_q_pool) { in mpi3mr_alloc_reply_sense_bufs()
3312 ioc_err(mrioc, "sense_buf_q pool: dma_pool_create failed\n"); in mpi3mr_alloc_reply_sense_bufs()
3315 mrioc->sense_buf_q = dma_pool_zalloc(mrioc->sense_buf_q_pool, in mpi3mr_alloc_reply_sense_bufs()
3316 GFP_KERNEL, &mrioc->sense_buf_q_dma); in mpi3mr_alloc_reply_sense_bufs()
3317 if (!mrioc->sense_buf_q) in mpi3mr_alloc_reply_sense_bufs()
3337 static void mpimr_initialize_reply_sbuf_queues(struct mpi3mr_ioc *mrioc) in mpimr_initialize_reply_sbuf_queues() argument
3342 sz = mrioc->num_reply_bufs * mrioc->reply_sz; in mpimr_initialize_reply_sbuf_queues()
3343 ioc_info(mrioc, in mpimr_initialize_reply_sbuf_queues()
3345 mrioc->reply_buf, mrioc->num_reply_bufs, mrioc->reply_sz, in mpimr_initialize_reply_sbuf_queues()
3346 (sz / 1024), (unsigned long long)mrioc->reply_buf_dma); in mpimr_initialize_reply_sbuf_queues()
3347 sz = mrioc->reply_free_qsz * 8; in mpimr_initialize_reply_sbuf_queues()
3348 ioc_info(mrioc, in mpimr_initialize_reply_sbuf_queues()
3350 mrioc->reply_free_q, mrioc->reply_free_qsz, 8, (sz / 1024), in mpimr_initialize_reply_sbuf_queues()
3351 (unsigned long long)mrioc->reply_free_q_dma); in mpimr_initialize_reply_sbuf_queues()
3352 sz = mrioc->num_sense_bufs * MPI3MR_SENSE_BUF_SZ; in mpimr_initialize_reply_sbuf_queues()
3353 ioc_info(mrioc, in mpimr_initialize_reply_sbuf_queues()
3355 mrioc->sense_buf, mrioc->num_sense_bufs, MPI3MR_SENSE_BUF_SZ, in mpimr_initialize_reply_sbuf_queues()
3356 (sz / 1024), (unsigned long long)mrioc->sense_buf_dma); in mpimr_initialize_reply_sbuf_queues()
3357 sz = mrioc->sense_buf_q_sz * 8; in mpimr_initialize_reply_sbuf_queues()
3358 ioc_info(mrioc, in mpimr_initialize_reply_sbuf_queues()
3360 mrioc->sense_buf_q, mrioc->sense_buf_q_sz, 8, (sz / 1024), in mpimr_initialize_reply_sbuf_queues()
3361 (unsigned long long)mrioc->sense_buf_q_dma); in mpimr_initialize_reply_sbuf_queues()
3364 for (i = 0, phy_addr = mrioc->reply_buf_dma; in mpimr_initialize_reply_sbuf_queues()
3365 i < mrioc->num_reply_bufs; i++, phy_addr += mrioc->reply_sz) in mpimr_initialize_reply_sbuf_queues()
3366 mrioc->reply_free_q[i] = cpu_to_le64(phy_addr); in mpimr_initialize_reply_sbuf_queues()
3367 mrioc->reply_free_q[i] = cpu_to_le64(0); in mpimr_initialize_reply_sbuf_queues()
3370 for (i = 0, phy_addr = mrioc->sense_buf_dma; in mpimr_initialize_reply_sbuf_queues()
3371 i < mrioc->num_sense_bufs; i++, phy_addr += MPI3MR_SENSE_BUF_SZ) in mpimr_initialize_reply_sbuf_queues()
3372 mrioc->sense_buf_q[i] = cpu_to_le64(phy_addr); in mpimr_initialize_reply_sbuf_queues()
3373 mrioc->sense_buf_q[i] = cpu_to_le64(0); in mpimr_initialize_reply_sbuf_queues()
3385 static int mpi3mr_issue_iocinit(struct mpi3mr_ioc *mrioc) in mpi3mr_issue_iocinit() argument
3394 drv_info = dma_alloc_coherent(&mrioc->pdev->dev, data_len, &data_dma, in mpi3mr_issue_iocinit()
3400 mpimr_initialize_reply_sbuf_queues(mrioc); in mpi3mr_issue_iocinit()
3411 memcpy((u8 *)&mrioc->driver_info, (u8 *)drv_info, in mpi3mr_issue_iocinit()
3412 sizeof(mrioc->driver_info)); in mpi3mr_issue_iocinit()
3415 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3416 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_iocinit()
3418 ioc_err(mrioc, "Issue IOCInit: Init command is in use\n"); in mpi3mr_issue_iocinit()
3419 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3422 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_iocinit()
3423 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_iocinit()
3424 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_iocinit()
3432 iocinit_req.reply_free_queue_depth = cpu_to_le16(mrioc->reply_free_qsz); in mpi3mr_issue_iocinit()
3434 cpu_to_le64(mrioc->reply_free_q_dma); in mpi3mr_issue_iocinit()
3437 cpu_to_le16(mrioc->sense_buf_q_sz); in mpi3mr_issue_iocinit()
3439 cpu_to_le64(mrioc->sense_buf_q_dma); in mpi3mr_issue_iocinit()
3450 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_iocinit()
3451 retval = mpi3mr_admin_request_post(mrioc, &iocinit_req, in mpi3mr_issue_iocinit()
3454 ioc_err(mrioc, "Issue IOCInit: Admin Post failed\n"); in mpi3mr_issue_iocinit()
3457 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_iocinit()
3459 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_iocinit()
3460 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_issue_iocinit()
3462 ioc_err(mrioc, "ioc_init timed out\n"); in mpi3mr_issue_iocinit()
3466 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_iocinit()
3468 ioc_err(mrioc, in mpi3mr_issue_iocinit()
3470 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_iocinit()
3471 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_iocinit()
3476 mrioc->reply_free_queue_host_index = mrioc->num_reply_bufs; in mpi3mr_issue_iocinit()
3477 writel(mrioc->reply_free_queue_host_index, in mpi3mr_issue_iocinit()
3478 &mrioc->sysif_regs->reply_free_host_index); in mpi3mr_issue_iocinit()
3480 mrioc->sbq_host_index = mrioc->num_sense_bufs; in mpi3mr_issue_iocinit()
3481 writel(mrioc->sbq_host_index, in mpi3mr_issue_iocinit()
3482 &mrioc->sysif_regs->sense_buffer_free_host_index); in mpi3mr_issue_iocinit()
3484 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_iocinit()
3485 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_iocinit()
3489 dma_free_coherent(&mrioc->pdev->dev, data_len, drv_info, in mpi3mr_issue_iocinit()
3505 static void mpi3mr_unmask_events(struct mpi3mr_ioc *mrioc, u16 event) in mpi3mr_unmask_events() argument
3516 mrioc->event_masks[word] &= ~desired_event; in mpi3mr_unmask_events()
3528 static int mpi3mr_issue_event_notification(struct mpi3mr_ioc *mrioc) in mpi3mr_issue_event_notification() argument
3535 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3536 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_event_notification()
3538 ioc_err(mrioc, "Issue EvtNotify: Init command is in use\n"); in mpi3mr_issue_event_notification()
3539 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3542 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_event_notification()
3543 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_event_notification()
3544 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_event_notification()
3549 cpu_to_le32(mrioc->event_masks[i]); in mpi3mr_issue_event_notification()
3550 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_event_notification()
3551 retval = mpi3mr_admin_request_post(mrioc, &evtnotify_req, in mpi3mr_issue_event_notification()
3554 ioc_err(mrioc, "Issue EvtNotify: Admin Post failed\n"); in mpi3mr_issue_event_notification()
3557 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_issue_event_notification()
3559 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_event_notification()
3560 ioc_err(mrioc, "event notification timed out\n"); in mpi3mr_issue_event_notification()
3561 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_issue_event_notification()
3566 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_issue_event_notification()
3568 ioc_err(mrioc, in mpi3mr_issue_event_notification()
3570 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_issue_event_notification()
3571 mrioc->init_cmds.ioc_loginfo); in mpi3mr_issue_event_notification()
3577 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_event_notification()
3578 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_event_notification()
3594 int mpi3mr_process_event_ack(struct mpi3mr_ioc *mrioc, u8 event, in mpi3mr_process_event_ack() argument
3601 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3602 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_process_event_ack()
3604 ioc_err(mrioc, "Send EvtAck: Init command is in use\n"); in mpi3mr_process_event_ack()
3605 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3608 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_process_event_ack()
3609 mrioc->init_cmds.is_waiting = 1; in mpi3mr_process_event_ack()
3610 mrioc->init_cmds.callback = NULL; in mpi3mr_process_event_ack()
3616 init_completion(&mrioc->init_cmds.done); in mpi3mr_process_event_ack()
3617 retval = mpi3mr_admin_request_post(mrioc, &evtack_req, in mpi3mr_process_event_ack()
3620 ioc_err(mrioc, "Send EvtAck: Admin Post failed\n"); in mpi3mr_process_event_ack()
3623 wait_for_completion_timeout(&mrioc->init_cmds.done, in mpi3mr_process_event_ack()
3625 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_process_event_ack()
3626 ioc_err(mrioc, "Issue EvtNotify: command timed out\n"); in mpi3mr_process_event_ack()
3627 if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET)) in mpi3mr_process_event_ack()
3628 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_process_event_ack()
3633 if ((mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK) in mpi3mr_process_event_ack()
3635 ioc_err(mrioc, in mpi3mr_process_event_ack()
3637 (mrioc->init_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK), in mpi3mr_process_event_ack()
3638 mrioc->init_cmds.ioc_loginfo); in mpi3mr_process_event_ack()
3644 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_process_event_ack()
3645 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_process_event_ack()
3660 static int mpi3mr_alloc_chain_bufs(struct mpi3mr_ioc *mrioc) in mpi3mr_alloc_chain_bufs() argument
3666 if (mrioc->chain_sgl_list) in mpi3mr_alloc_chain_bufs()
3669 num_chains = mrioc->max_host_ios / MPI3MR_CHAINBUF_FACTOR; in mpi3mr_alloc_chain_bufs()
3677 mrioc->chain_buf_count = num_chains; in mpi3mr_alloc_chain_bufs()
3679 mrioc->chain_sgl_list = kzalloc(sz, GFP_KERNEL); in mpi3mr_alloc_chain_bufs()
3680 if (!mrioc->chain_sgl_list) in mpi3mr_alloc_chain_bufs()
3683 if (mrioc->max_sgl_entries > (mrioc->facts.max_data_length / in mpi3mr_alloc_chain_bufs()
3685 mrioc->max_sgl_entries = mrioc->facts.max_data_length / in mpi3mr_alloc_chain_bufs()
3687 sz = mrioc->max_sgl_entries * sizeof(struct mpi3_sge_common); in mpi3mr_alloc_chain_bufs()
3688 ioc_info(mrioc, "number of sgl entries=%d chain buffer size=%dKB\n", in mpi3mr_alloc_chain_bufs()
3689 mrioc->max_sgl_entries, sz/1024); in mpi3mr_alloc_chain_bufs()
3691 mrioc->chain_buf_pool = dma_pool_create("chain_buf pool", in mpi3mr_alloc_chain_bufs()
3692 &mrioc->pdev->dev, sz, 16, 0); in mpi3mr_alloc_chain_bufs()
3693 if (!mrioc->chain_buf_pool) { in mpi3mr_alloc_chain_bufs()
3694 ioc_err(mrioc, "chain buf pool: dma_pool_create failed\n"); in mpi3mr_alloc_chain_bufs()
3699 mrioc->chain_sgl_list[i].addr = in mpi3mr_alloc_chain_bufs()
3700 dma_pool_zalloc(mrioc->chain_buf_pool, GFP_KERNEL, in mpi3mr_alloc_chain_bufs()
3701 &mrioc->chain_sgl_list[i].dma_addr); in mpi3mr_alloc_chain_bufs()
3703 if (!mrioc->chain_sgl_list[i].addr) in mpi3mr_alloc_chain_bufs()
3706 mrioc->chain_bitmap = bitmap_zalloc(num_chains, GFP_KERNEL); in mpi3mr_alloc_chain_bufs()
3707 if (!mrioc->chain_bitmap) in mpi3mr_alloc_chain_bufs()
3725 static void mpi3mr_port_enable_complete(struct mpi3mr_ioc *mrioc, in mpi3mr_port_enable_complete() argument
3729 mrioc->scan_started = 0; in mpi3mr_port_enable_complete()
3731 mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR; in mpi3mr_port_enable_complete()
3733 mrioc->scan_failed = drv_cmd->ioc_status; in mpi3mr_port_enable_complete()
3748 int mpi3mr_issue_port_enable(struct mpi3mr_ioc *mrioc, u8 async) in mpi3mr_issue_port_enable() argument
3755 mutex_lock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3756 if (mrioc->init_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_issue_port_enable()
3758 ioc_err(mrioc, "Issue PortEnable: Init command is in use\n"); in mpi3mr_issue_port_enable()
3759 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3762 mrioc->init_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_issue_port_enable()
3764 mrioc->init_cmds.is_waiting = 0; in mpi3mr_issue_port_enable()
3765 mrioc->init_cmds.callback = mpi3mr_port_enable_complete; in mpi3mr_issue_port_enable()
3767 mrioc->init_cmds.is_waiting = 1; in mpi3mr_issue_port_enable()
3768 mrioc->init_cmds.callback = NULL; in mpi3mr_issue_port_enable()
3769 init_completion(&mrioc->init_cmds.done); in mpi3mr_issue_port_enable()
3774 retval = mpi3mr_admin_request_post(mrioc, &pe_req, sizeof(pe_req), 1); in mpi3mr_issue_port_enable()
3776 ioc_err(mrioc, "Issue PortEnable: Admin Post failed\n"); in mpi3mr_issue_port_enable()
3780 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3784 wait_for_completion_timeout(&mrioc->init_cmds.done, (pe_timeout * HZ)); in mpi3mr_issue_port_enable()
3785 if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_issue_port_enable()
3786 ioc_err(mrioc, "port enable timed out\n"); in mpi3mr_issue_port_enable()
3788 mpi3mr_check_rh_fault_ioc(mrioc, MPI3MR_RESET_FROM_PE_TIMEOUT); in mpi3mr_issue_port_enable()
3791 mpi3mr_port_enable_complete(mrioc, &mrioc->init_cmds); in mpi3mr_issue_port_enable()
3794 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_issue_port_enable()
3795 mutex_unlock(&mrioc->init_cmds.mutex); in mpi3mr_issue_port_enable()
3828 static int mpi3mr_repost_diag_bufs(struct mpi3mr_ioc *mrioc) in mpi3mr_repost_diag_bufs() argument
3839 retval = mpi3mr_refresh_trigger(mrioc, MPI3_CONFIG_ACTION_READ_CURRENT); in mpi3mr_repost_diag_bufs()
3843 trace_hdb = mpi3mr_diag_buffer_for_type(mrioc, in mpi3mr_repost_diag_bufs()
3852 fw_hdb = mpi3mr_diag_buffer_for_type(mrioc, MPI3_DIAG_BUFFER_TYPE_FW); in mpi3mr_repost_diag_bufs()
3860 global_trigger = le64_to_cpu(mrioc->driver_pg2->global_trigger); in mpi3mr_repost_diag_bufs()
3873 retval = mpi3mr_issue_diag_buf_post(mrioc, trace_hdb); in mpi3mr_repost_diag_bufs()
3875 dprint_init(mrioc, "trace diag buffer reposted"); in mpi3mr_repost_diag_bufs()
3882 ioc_err(mrioc, "trace diag buffer repost failed"); in mpi3mr_repost_diag_bufs()
3891 retval = mpi3mr_issue_diag_buf_post(mrioc, fw_hdb); in mpi3mr_repost_diag_bufs()
3893 dprint_init(mrioc, "firmware diag buffer reposted"); in mpi3mr_repost_diag_bufs()
3900 ioc_err(mrioc, "firmware diag buffer repost failed"); in mpi3mr_repost_diag_bufs()
3917 mpi3mr_read_tsu_interval(struct mpi3mr_ioc *mrioc) in mpi3mr_read_tsu_interval() argument
3923 mrioc->ts_update_interval = MPI3MR_TSUPDATE_INTERVAL; in mpi3mr_read_tsu_interval()
3925 retval = mpi3mr_cfg_get_driver_pg1(mrioc, &driver_pg1, pg_sz); in mpi3mr_read_tsu_interval()
3927 mrioc->ts_update_interval = (driver_pg1.time_stamp_update * 60); in mpi3mr_read_tsu_interval()
3940 mpi3mr_print_ioc_info(struct mpi3mr_ioc *mrioc) in mpi3mr_print_ioc_info() argument
3946 struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver; in mpi3mr_print_ioc_info()
3948 switch (mrioc->facts.personality) { in mpi3mr_print_ioc_info()
3960 ioc_info(mrioc, "Running in %s Personality", personality); in mpi3mr_print_ioc_info()
3962 ioc_info(mrioc, "FW version(%d.%d.%d.%d.%d.%d)\n", in mpi3mr_print_ioc_info()
3967 if (mrioc->facts.protocol_flags & in mpi3mr_print_ioc_info()
3978 if (mrioc->facts.protocol_flags & in mpi3mr_print_ioc_info()
3987 ioc_info(mrioc, "Protocol=(%s), Capabilities=(%s)\n", in mpi3mr_print_ioc_info()
3999 void mpi3mr_cleanup_resources(struct mpi3mr_ioc *mrioc) in mpi3mr_cleanup_resources() argument
4001 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_cleanup_resources()
4003 mpi3mr_cleanup_isr(mrioc); in mpi3mr_cleanup_resources()
4005 if (mrioc->sysif_regs) { in mpi3mr_cleanup_resources()
4006 iounmap((void __iomem *)mrioc->sysif_regs); in mpi3mr_cleanup_resources()
4007 mrioc->sysif_regs = NULL; in mpi3mr_cleanup_resources()
4011 if (mrioc->bars) in mpi3mr_cleanup_resources()
4012 pci_release_selected_regions(pdev, mrioc->bars); in mpi3mr_cleanup_resources()
4025 int mpi3mr_setup_resources(struct mpi3mr_ioc *mrioc) in mpi3mr_setup_resources() argument
4027 struct pci_dev *pdev = mrioc->pdev; in mpi3mr_setup_resources()
4031 u64 dma_mask = mrioc->dma_mask ? mrioc->dma_mask : in mpi3mr_setup_resources()
4035 ioc_err(mrioc, "pci_enable_device_mem: failed\n"); in mpi3mr_setup_resources()
4042 ioc_err(mrioc, "Unable to find MSI-X Capabilities\n"); in mpi3mr_setup_resources()
4046 mrioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); in mpi3mr_setup_resources()
4048 if (pci_request_selected_regions(pdev, mrioc->bars, in mpi3mr_setup_resources()
4049 mrioc->driver_name)) { in mpi3mr_setup_resources()
4050 ioc_err(mrioc, "pci_request_selected_regions: failed\n"); in mpi3mr_setup_resources()
4057 mrioc->sysif_regs_phys = pci_resource_start(pdev, i); in mpi3mr_setup_resources()
4059 mrioc->sysif_regs = in mpi3mr_setup_resources()
4060 ioremap(mrioc->sysif_regs_phys, memap_sz); in mpi3mr_setup_resources()
4070 ioc_warn(mrioc, "Setting 64 bit DMA mask failed\n"); in mpi3mr_setup_resources()
4076 mrioc->dma_mask = 0; in mpi3mr_setup_resources()
4077 ioc_err(mrioc, "Setting 32 bit DMA mask also failed\n"); in mpi3mr_setup_resources()
4081 mrioc->dma_mask = dma_mask; in mpi3mr_setup_resources()
4083 if (!mrioc->sysif_regs) { in mpi3mr_setup_resources()
4084 ioc_err(mrioc, in mpi3mr_setup_resources()
4091 mrioc->msix_count = (message_control & 0x3FF) + 1; in mpi3mr_setup_resources()
4095 pci_set_drvdata(pdev, mrioc->shost); in mpi3mr_setup_resources()
4097 mpi3mr_ioc_disable_intr(mrioc); in mpi3mr_setup_resources()
4099 ioc_info(mrioc, "iomem(0x%016llx), mapped(0x%p), size(%d)\n", in mpi3mr_setup_resources()
4100 (unsigned long long)mrioc->sysif_regs_phys, in mpi3mr_setup_resources()
4101 mrioc->sysif_regs, memap_sz); in mpi3mr_setup_resources()
4102 ioc_info(mrioc, "Number of MSI-X vectors found in capabilities: (%d)\n", in mpi3mr_setup_resources()
4103 mrioc->msix_count); in mpi3mr_setup_resources()
4106 mrioc->requested_poll_qcount = min_t(int, poll_queues, in mpi3mr_setup_resources()
4107 mrioc->msix_count - 2); in mpi3mr_setup_resources()
4111 mpi3mr_cleanup_resources(mrioc); in mpi3mr_setup_resources()
4125 static int mpi3mr_enable_events(struct mpi3mr_ioc *mrioc) in mpi3mr_enable_events() argument
4131 mrioc->event_masks[i] = -1; in mpi3mr_enable_events()
4133 mpi3mr_unmask_events(mrioc, MPI3_EVENT_DEVICE_ADDED); in mpi3mr_enable_events()
4134 mpi3mr_unmask_events(mrioc, MPI3_EVENT_DEVICE_INFO_CHANGED); in mpi3mr_enable_events()
4135 mpi3mr_unmask_events(mrioc, MPI3_EVENT_DEVICE_STATUS_CHANGE); in mpi3mr_enable_events()
4136 mpi3mr_unmask_events(mrioc, MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE); in mpi3mr_enable_events()
4137 mpi3mr_unmask_events(mrioc, MPI3_EVENT_ENCL_DEVICE_ADDED); in mpi3mr_enable_events()
4138 mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST); in mpi3mr_enable_events()
4139 mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_DISCOVERY); in mpi3mr_enable_events()
4140 mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR); in mpi3mr_enable_events()
4141 mpi3mr_unmask_events(mrioc, MPI3_EVENT_SAS_BROADCAST_PRIMITIVE); in mpi3mr_enable_events()
4142 mpi3mr_unmask_events(mrioc, MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST); in mpi3mr_enable_events()
4143 mpi3mr_unmask_events(mrioc, MPI3_EVENT_PCIE_ENUMERATION); in mpi3mr_enable_events()
4144 mpi3mr_unmask_events(mrioc, MPI3_EVENT_PREPARE_FOR_RESET); in mpi3mr_enable_events()
4145 mpi3mr_unmask_events(mrioc, MPI3_EVENT_CABLE_MGMT); in mpi3mr_enable_events()
4146 mpi3mr_unmask_events(mrioc, MPI3_EVENT_ENERGY_PACK_CHANGE); in mpi3mr_enable_events()
4147 mpi3mr_unmask_events(mrioc, MPI3_EVENT_DIAGNOSTIC_BUFFER_STATUS_CHANGE); in mpi3mr_enable_events()
4149 retval = mpi3mr_issue_event_notification(mrioc); in mpi3mr_enable_events()
4151 ioc_err(mrioc, "failed to issue event notification %d\n", in mpi3mr_enable_events()
4171 int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc) in mpi3mr_init_ioc() argument
4179 retval = mpi3mr_bring_ioc_ready(mrioc); in mpi3mr_init_ioc()
4181 ioc_err(mrioc, "Failed to bring ioc ready: error %d\n", in mpi3mr_init_ioc()
4186 retval = mpi3mr_setup_isr(mrioc, 1); in mpi3mr_init_ioc()
4188 ioc_err(mrioc, "Failed to setup ISR error %d\n", in mpi3mr_init_ioc()
4193 retval = mpi3mr_issue_iocfacts(mrioc, &facts_data); in mpi3mr_init_ioc()
4195 ioc_err(mrioc, "Failed to Issue IOC Facts %d\n", in mpi3mr_init_ioc()
4200 mrioc->max_host_ios = mrioc->facts.max_reqs - MPI3MR_INTERNAL_CMDS_RESVD; in mpi3mr_init_ioc()
4201 mrioc->shost->max_sectors = mrioc->facts.max_data_length / 512; in mpi3mr_init_ioc()
4202 mrioc->num_io_throttle_group = mrioc->facts.max_io_throttle_group; in mpi3mr_init_ioc()
4203 atomic_set(&mrioc->pend_large_data_sz, 0); in mpi3mr_init_ioc()
4206 mrioc->max_host_ios = min_t(int, mrioc->max_host_ios, in mpi3mr_init_ioc()
4209 if (!(mrioc->facts.ioc_capabilities & in mpi3mr_init_ioc()
4211 mrioc->sas_transport_enabled = 1; in mpi3mr_init_ioc()
4212 mrioc->scsi_device_channel = 1; in mpi3mr_init_ioc()
4213 mrioc->shost->max_channel = 1; in mpi3mr_init_ioc()
4214 mrioc->shost->transportt = mpi3mr_transport_template; in mpi3mr_init_ioc()
4217 mrioc->reply_sz = mrioc->facts.reply_sz; in mpi3mr_init_ioc()
4219 retval = mpi3mr_check_reset_dma_mask(mrioc); in mpi3mr_init_ioc()
4221 ioc_err(mrioc, "Resetting dma mask failed %d\n", in mpi3mr_init_ioc()
4226 mpi3mr_read_tsu_interval(mrioc); in mpi3mr_init_ioc()
4227 mpi3mr_print_ioc_info(mrioc); in mpi3mr_init_ioc()
4229 dprint_init(mrioc, "allocating host diag buffers\n"); in mpi3mr_init_ioc()
4230 mpi3mr_alloc_diag_bufs(mrioc); in mpi3mr_init_ioc()
4232 dprint_init(mrioc, "allocating ioctl dma buffers\n"); in mpi3mr_init_ioc()
4233 mpi3mr_alloc_ioctl_dma_memory(mrioc); in mpi3mr_init_ioc()
4235 dprint_init(mrioc, "posting host diag buffers\n"); in mpi3mr_init_ioc()
4236 retval = mpi3mr_post_diag_bufs(mrioc); in mpi3mr_init_ioc()
4239 ioc_warn(mrioc, "failed to post host diag buffers\n"); in mpi3mr_init_ioc()
4241 if (!mrioc->init_cmds.reply) { in mpi3mr_init_ioc()
4242 retval = mpi3mr_alloc_reply_sense_bufs(mrioc); in mpi3mr_init_ioc()
4244 ioc_err(mrioc, in mpi3mr_init_ioc()
4251 if (!mrioc->chain_sgl_list) { in mpi3mr_init_ioc()
4252 retval = mpi3mr_alloc_chain_bufs(mrioc); in mpi3mr_init_ioc()
4254 ioc_err(mrioc, "Failed to allocated chain buffers %d\n", in mpi3mr_init_ioc()
4260 retval = mpi3mr_issue_iocinit(mrioc); in mpi3mr_init_ioc()
4262 ioc_err(mrioc, "Failed to Issue IOC Init %d\n", in mpi3mr_init_ioc()
4267 retval = mpi3mr_print_pkg_ver(mrioc); in mpi3mr_init_ioc()
4269 ioc_err(mrioc, "failed to get package version\n"); in mpi3mr_init_ioc()
4273 retval = mpi3mr_setup_isr(mrioc, 0); in mpi3mr_init_ioc()
4275 ioc_err(mrioc, "Failed to re-setup ISR, error %d\n", in mpi3mr_init_ioc()
4280 retval = mpi3mr_create_op_queues(mrioc); in mpi3mr_init_ioc()
4282 ioc_err(mrioc, "Failed to create OpQueues error %d\n", in mpi3mr_init_ioc()
4287 if (!mrioc->pel_seqnum_virt) { in mpi3mr_init_ioc()
4288 dprint_init(mrioc, "allocating memory for pel_seqnum_virt\n"); in mpi3mr_init_ioc()
4289 mrioc->pel_seqnum_sz = sizeof(struct mpi3_pel_seq); in mpi3mr_init_ioc()
4290 mrioc->pel_seqnum_virt = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_init_ioc()
4291 mrioc->pel_seqnum_sz, &mrioc->pel_seqnum_dma, in mpi3mr_init_ioc()
4293 if (!mrioc->pel_seqnum_virt) { in mpi3mr_init_ioc()
4299 if (!mrioc->throttle_groups && mrioc->num_io_throttle_group) { in mpi3mr_init_ioc()
4300 dprint_init(mrioc, "allocating memory for throttle groups\n"); in mpi3mr_init_ioc()
4302 mrioc->throttle_groups = kcalloc(mrioc->num_io_throttle_group, sz, GFP_KERNEL); in mpi3mr_init_ioc()
4303 if (!mrioc->throttle_groups) { in mpi3mr_init_ioc()
4309 retval = mpi3mr_enable_events(mrioc); in mpi3mr_init_ioc()
4311 ioc_err(mrioc, "failed to enable events %d\n", in mpi3mr_init_ioc()
4316 retval = mpi3mr_refresh_trigger(mrioc, MPI3_CONFIG_ACTION_READ_CURRENT); in mpi3mr_init_ioc()
4318 ioc_err(mrioc, "failed to refresh triggers\n"); in mpi3mr_init_ioc()
4322 ioc_info(mrioc, "controller initialization completed successfully\n"); in mpi3mr_init_ioc()
4327 ioc_warn(mrioc, "retrying controller initialization, retry_count:%d\n", in mpi3mr_init_ioc()
4329 mpi3mr_memset_buffers(mrioc); in mpi3mr_init_ioc()
4334 ioc_err(mrioc, "controller initialization failed\n"); in mpi3mr_init_ioc()
4335 mpi3mr_issue_reset(mrioc, MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, in mpi3mr_init_ioc()
4337 mrioc->unrecoverable = 1; in mpi3mr_init_ioc()
4355 int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume) in mpi3mr_reinit_ioc() argument
4366 dprint_reset(mrioc, "bringing up the controller to ready state\n"); in mpi3mr_reinit_ioc()
4367 retval = mpi3mr_bring_ioc_ready(mrioc); in mpi3mr_reinit_ioc()
4369 ioc_err(mrioc, "failed to bring to ready state\n"); in mpi3mr_reinit_ioc()
4373 if (is_resume || mrioc->block_on_pci_err) { in mpi3mr_reinit_ioc()
4374 dprint_reset(mrioc, "setting up single ISR\n"); in mpi3mr_reinit_ioc()
4375 retval = mpi3mr_setup_isr(mrioc, 1); in mpi3mr_reinit_ioc()
4377 ioc_err(mrioc, "failed to setup ISR\n"); in mpi3mr_reinit_ioc()
4381 mpi3mr_ioc_enable_intr(mrioc); in mpi3mr_reinit_ioc()
4383 dprint_reset(mrioc, "getting ioc_facts\n"); in mpi3mr_reinit_ioc()
4384 retval = mpi3mr_issue_iocfacts(mrioc, &facts_data); in mpi3mr_reinit_ioc()
4386 ioc_err(mrioc, "failed to get ioc_facts\n"); in mpi3mr_reinit_ioc()
4390 dprint_reset(mrioc, "validating ioc_facts\n"); in mpi3mr_reinit_ioc()
4391 retval = mpi3mr_revalidate_factsdata(mrioc); in mpi3mr_reinit_ioc()
4393 ioc_err(mrioc, "failed to revalidate ioc_facts data\n"); in mpi3mr_reinit_ioc()
4397 mpi3mr_read_tsu_interval(mrioc); in mpi3mr_reinit_ioc()
4398 mpi3mr_print_ioc_info(mrioc); in mpi3mr_reinit_ioc()
4401 dprint_reset(mrioc, "posting host diag buffers\n"); in mpi3mr_reinit_ioc()
4402 retval = mpi3mr_post_diag_bufs(mrioc); in mpi3mr_reinit_ioc()
4404 ioc_warn(mrioc, "failed to post host diag buffers\n"); in mpi3mr_reinit_ioc()
4406 retval = mpi3mr_repost_diag_bufs(mrioc); in mpi3mr_reinit_ioc()
4408 ioc_warn(mrioc, "failed to re post host diag buffers\n"); in mpi3mr_reinit_ioc()
4411 dprint_reset(mrioc, "sending ioc_init\n"); in mpi3mr_reinit_ioc()
4412 retval = mpi3mr_issue_iocinit(mrioc); in mpi3mr_reinit_ioc()
4414 ioc_err(mrioc, "failed to send ioc_init\n"); in mpi3mr_reinit_ioc()
4418 dprint_reset(mrioc, "getting package version\n"); in mpi3mr_reinit_ioc()
4419 retval = mpi3mr_print_pkg_ver(mrioc); in mpi3mr_reinit_ioc()
4421 ioc_err(mrioc, "failed to get package version\n"); in mpi3mr_reinit_ioc()
4425 if (is_resume || mrioc->block_on_pci_err) { in mpi3mr_reinit_ioc()
4426 dprint_reset(mrioc, "setting up multiple ISR\n"); in mpi3mr_reinit_ioc()
4427 retval = mpi3mr_setup_isr(mrioc, 0); in mpi3mr_reinit_ioc()
4429 ioc_err(mrioc, "failed to re-setup ISR\n"); in mpi3mr_reinit_ioc()
4434 dprint_reset(mrioc, "creating operational queue pairs\n"); in mpi3mr_reinit_ioc()
4435 retval = mpi3mr_create_op_queues(mrioc); in mpi3mr_reinit_ioc()
4437 ioc_err(mrioc, "failed to create operational queue pairs\n"); in mpi3mr_reinit_ioc()
4441 if (!mrioc->pel_seqnum_virt) { in mpi3mr_reinit_ioc()
4442 dprint_reset(mrioc, "allocating memory for pel_seqnum_virt\n"); in mpi3mr_reinit_ioc()
4443 mrioc->pel_seqnum_sz = sizeof(struct mpi3_pel_seq); in mpi3mr_reinit_ioc()
4444 mrioc->pel_seqnum_virt = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_reinit_ioc()
4445 mrioc->pel_seqnum_sz, &mrioc->pel_seqnum_dma, in mpi3mr_reinit_ioc()
4447 if (!mrioc->pel_seqnum_virt) { in mpi3mr_reinit_ioc()
4453 if (mrioc->shost->nr_hw_queues > mrioc->num_op_reply_q) { in mpi3mr_reinit_ioc()
4454 ioc_err(mrioc, in mpi3mr_reinit_ioc()
4456 mrioc->shost->nr_hw_queues, mrioc->num_op_reply_q); in mpi3mr_reinit_ioc()
4461 dprint_reset(mrioc, "enabling events\n"); in mpi3mr_reinit_ioc()
4462 retval = mpi3mr_enable_events(mrioc); in mpi3mr_reinit_ioc()
4464 ioc_err(mrioc, "failed to enable events\n"); in mpi3mr_reinit_ioc()
4468 mrioc->device_refresh_on = 1; in mpi3mr_reinit_ioc()
4469 mpi3mr_add_event_wait_for_device_refresh(mrioc); in mpi3mr_reinit_ioc()
4471 ioc_info(mrioc, "sending port enable\n"); in mpi3mr_reinit_ioc()
4472 retval = mpi3mr_issue_port_enable(mrioc, 1); in mpi3mr_reinit_ioc()
4474 ioc_err(mrioc, "failed to issue port enable\n"); in mpi3mr_reinit_ioc()
4479 if (mrioc->init_cmds.state == MPI3MR_CMD_NOTUSED) in mpi3mr_reinit_ioc()
4481 if (!pci_device_is_present(mrioc->pdev)) in mpi3mr_reinit_ioc()
4482 mrioc->unrecoverable = 1; in mpi3mr_reinit_ioc()
4483 if (mrioc->unrecoverable) { in mpi3mr_reinit_ioc()
4487 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_reinit_ioc()
4490 mpi3mr_print_fault_info(mrioc); in mpi3mr_reinit_ioc()
4491 mrioc->init_cmds.is_waiting = 0; in mpi3mr_reinit_ioc()
4492 mrioc->init_cmds.callback = NULL; in mpi3mr_reinit_ioc()
4493 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_reinit_ioc()
4499 ioc_err(mrioc, "port enable timed out\n"); in mpi3mr_reinit_ioc()
4500 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_reinit_ioc()
4502 mrioc->init_cmds.is_waiting = 0; in mpi3mr_reinit_ioc()
4503 mrioc->init_cmds.callback = NULL; in mpi3mr_reinit_ioc()
4504 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_reinit_ioc()
4506 } else if (mrioc->scan_failed) { in mpi3mr_reinit_ioc()
4507 ioc_err(mrioc, in mpi3mr_reinit_ioc()
4509 mrioc->scan_failed); in mpi3mr_reinit_ioc()
4511 ioc_info(mrioc, "port enable completed successfully\n"); in mpi3mr_reinit_ioc()
4513 ioc_info(mrioc, "controller %s completed successfully\n", in mpi3mr_reinit_ioc()
4519 ioc_warn(mrioc, "retrying controller %s, retry_count:%d\n", in mpi3mr_reinit_ioc()
4521 mpi3mr_memset_buffers(mrioc); in mpi3mr_reinit_ioc()
4526 ioc_err(mrioc, "controller %s is failed\n", in mpi3mr_reinit_ioc()
4528 mpi3mr_issue_reset(mrioc, MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, in mpi3mr_reinit_ioc()
4530 mrioc->unrecoverable = 1; in mpi3mr_reinit_ioc()
4542 static void mpi3mr_memset_op_reply_q_buffers(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_memset_op_reply_q_buffers() argument
4544 struct op_reply_qinfo *op_reply_q = mrioc->op_reply_qinfo + qidx; in mpi3mr_memset_op_reply_q_buffers()
4551 size = op_reply_q->segment_qd * mrioc->op_reply_desc_sz; in mpi3mr_memset_op_reply_q_buffers()
4565 static void mpi3mr_memset_op_req_q_buffers(struct mpi3mr_ioc *mrioc, u16 qidx) in mpi3mr_memset_op_req_q_buffers() argument
4567 struct op_req_qinfo *op_req_q = mrioc->req_qinfo + qidx; in mpi3mr_memset_op_req_q_buffers()
4574 size = op_req_q->segment_qd * mrioc->facts.op_req_sz; in mpi3mr_memset_op_req_q_buffers()
4590 void mpi3mr_memset_buffers(struct mpi3mr_ioc *mrioc) in mpi3mr_memset_buffers() argument
4595 mrioc->change_count = 0; in mpi3mr_memset_buffers()
4596 mrioc->active_poll_qcount = 0; in mpi3mr_memset_buffers()
4597 mrioc->default_qcount = 0; in mpi3mr_memset_buffers()
4598 if (mrioc->admin_req_base) in mpi3mr_memset_buffers()
4599 memset(mrioc->admin_req_base, 0, mrioc->admin_req_q_sz); in mpi3mr_memset_buffers()
4600 if (mrioc->admin_reply_base) in mpi3mr_memset_buffers()
4601 memset(mrioc->admin_reply_base, 0, mrioc->admin_reply_q_sz); in mpi3mr_memset_buffers()
4602 atomic_set(&mrioc->admin_reply_q_in_use, 0); in mpi3mr_memset_buffers()
4604 if (mrioc->init_cmds.reply) { in mpi3mr_memset_buffers()
4605 memset(mrioc->init_cmds.reply, 0, sizeof(*mrioc->init_cmds.reply)); in mpi3mr_memset_buffers()
4606 memset(mrioc->bsg_cmds.reply, 0, in mpi3mr_memset_buffers()
4607 sizeof(*mrioc->bsg_cmds.reply)); in mpi3mr_memset_buffers()
4608 memset(mrioc->host_tm_cmds.reply, 0, in mpi3mr_memset_buffers()
4609 sizeof(*mrioc->host_tm_cmds.reply)); in mpi3mr_memset_buffers()
4610 memset(mrioc->pel_cmds.reply, 0, in mpi3mr_memset_buffers()
4611 sizeof(*mrioc->pel_cmds.reply)); in mpi3mr_memset_buffers()
4612 memset(mrioc->pel_abort_cmd.reply, 0, in mpi3mr_memset_buffers()
4613 sizeof(*mrioc->pel_abort_cmd.reply)); in mpi3mr_memset_buffers()
4614 memset(mrioc->transport_cmds.reply, 0, in mpi3mr_memset_buffers()
4615 sizeof(*mrioc->transport_cmds.reply)); in mpi3mr_memset_buffers()
4617 memset(mrioc->dev_rmhs_cmds[i].reply, 0, in mpi3mr_memset_buffers()
4618 sizeof(*mrioc->dev_rmhs_cmds[i].reply)); in mpi3mr_memset_buffers()
4620 memset(mrioc->evtack_cmds[i].reply, 0, in mpi3mr_memset_buffers()
4621 sizeof(*mrioc->evtack_cmds[i].reply)); in mpi3mr_memset_buffers()
4622 bitmap_clear(mrioc->removepend_bitmap, 0, in mpi3mr_memset_buffers()
4623 mrioc->dev_handle_bitmap_bits); in mpi3mr_memset_buffers()
4624 bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD); in mpi3mr_memset_buffers()
4625 bitmap_clear(mrioc->evtack_cmds_bitmap, 0, in mpi3mr_memset_buffers()
4629 for (i = 0; i < mrioc->num_queues; i++) { in mpi3mr_memset_buffers()
4630 mrioc->op_reply_qinfo[i].qid = 0; in mpi3mr_memset_buffers()
4631 mrioc->op_reply_qinfo[i].ci = 0; in mpi3mr_memset_buffers()
4632 mrioc->op_reply_qinfo[i].num_replies = 0; in mpi3mr_memset_buffers()
4633 mrioc->op_reply_qinfo[i].ephase = 0; in mpi3mr_memset_buffers()
4634 atomic_set(&mrioc->op_reply_qinfo[i].pend_ios, 0); in mpi3mr_memset_buffers()
4635 atomic_set(&mrioc->op_reply_qinfo[i].in_use, 0); in mpi3mr_memset_buffers()
4636 mpi3mr_memset_op_reply_q_buffers(mrioc, i); in mpi3mr_memset_buffers()
4638 mrioc->req_qinfo[i].ci = 0; in mpi3mr_memset_buffers()
4639 mrioc->req_qinfo[i].pi = 0; in mpi3mr_memset_buffers()
4640 mrioc->req_qinfo[i].num_requests = 0; in mpi3mr_memset_buffers()
4641 mrioc->req_qinfo[i].qid = 0; in mpi3mr_memset_buffers()
4642 mrioc->req_qinfo[i].reply_qid = 0; in mpi3mr_memset_buffers()
4643 spin_lock_init(&mrioc->req_qinfo[i].q_lock); in mpi3mr_memset_buffers()
4644 mpi3mr_memset_op_req_q_buffers(mrioc, i); in mpi3mr_memset_buffers()
4647 atomic_set(&mrioc->pend_large_data_sz, 0); in mpi3mr_memset_buffers()
4648 if (mrioc->throttle_groups) { in mpi3mr_memset_buffers()
4649 tg = mrioc->throttle_groups; in mpi3mr_memset_buffers()
4650 for (i = 0; i < mrioc->num_io_throttle_group; i++, tg++) { in mpi3mr_memset_buffers()
4672 void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc) in mpi3mr_free_mem() argument
4678 mpi3mr_free_enclosure_list(mrioc); in mpi3mr_free_mem()
4679 mpi3mr_free_ioctl_dma_memory(mrioc); in mpi3mr_free_mem()
4681 if (mrioc->sense_buf_pool) { in mpi3mr_free_mem()
4682 if (mrioc->sense_buf) in mpi3mr_free_mem()
4683 dma_pool_free(mrioc->sense_buf_pool, mrioc->sense_buf, in mpi3mr_free_mem()
4684 mrioc->sense_buf_dma); in mpi3mr_free_mem()
4685 dma_pool_destroy(mrioc->sense_buf_pool); in mpi3mr_free_mem()
4686 mrioc->sense_buf = NULL; in mpi3mr_free_mem()
4687 mrioc->sense_buf_pool = NULL; in mpi3mr_free_mem()
4689 if (mrioc->sense_buf_q_pool) { in mpi3mr_free_mem()
4690 if (mrioc->sense_buf_q) in mpi3mr_free_mem()
4691 dma_pool_free(mrioc->sense_buf_q_pool, in mpi3mr_free_mem()
4692 mrioc->sense_buf_q, mrioc->sense_buf_q_dma); in mpi3mr_free_mem()
4693 dma_pool_destroy(mrioc->sense_buf_q_pool); in mpi3mr_free_mem()
4694 mrioc->sense_buf_q = NULL; in mpi3mr_free_mem()
4695 mrioc->sense_buf_q_pool = NULL; in mpi3mr_free_mem()
4698 if (mrioc->reply_buf_pool) { in mpi3mr_free_mem()
4699 if (mrioc->reply_buf) in mpi3mr_free_mem()
4700 dma_pool_free(mrioc->reply_buf_pool, mrioc->reply_buf, in mpi3mr_free_mem()
4701 mrioc->reply_buf_dma); in mpi3mr_free_mem()
4702 dma_pool_destroy(mrioc->reply_buf_pool); in mpi3mr_free_mem()
4703 mrioc->reply_buf = NULL; in mpi3mr_free_mem()
4704 mrioc->reply_buf_pool = NULL; in mpi3mr_free_mem()
4706 if (mrioc->reply_free_q_pool) { in mpi3mr_free_mem()
4707 if (mrioc->reply_free_q) in mpi3mr_free_mem()
4708 dma_pool_free(mrioc->reply_free_q_pool, in mpi3mr_free_mem()
4709 mrioc->reply_free_q, mrioc->reply_free_q_dma); in mpi3mr_free_mem()
4710 dma_pool_destroy(mrioc->reply_free_q_pool); in mpi3mr_free_mem()
4711 mrioc->reply_free_q = NULL; in mpi3mr_free_mem()
4712 mrioc->reply_free_q_pool = NULL; in mpi3mr_free_mem()
4715 for (i = 0; i < mrioc->num_op_req_q; i++) in mpi3mr_free_mem()
4716 mpi3mr_free_op_req_q_segments(mrioc, i); in mpi3mr_free_mem()
4718 for (i = 0; i < mrioc->num_op_reply_q; i++) in mpi3mr_free_mem()
4719 mpi3mr_free_op_reply_q_segments(mrioc, i); in mpi3mr_free_mem()
4721 for (i = 0; i < mrioc->intr_info_count; i++) { in mpi3mr_free_mem()
4722 intr_info = mrioc->intr_info + i; in mpi3mr_free_mem()
4726 kfree(mrioc->req_qinfo); in mpi3mr_free_mem()
4727 mrioc->req_qinfo = NULL; in mpi3mr_free_mem()
4728 mrioc->num_op_req_q = 0; in mpi3mr_free_mem()
4730 kfree(mrioc->op_reply_qinfo); in mpi3mr_free_mem()
4731 mrioc->op_reply_qinfo = NULL; in mpi3mr_free_mem()
4732 mrioc->num_op_reply_q = 0; in mpi3mr_free_mem()
4734 kfree(mrioc->init_cmds.reply); in mpi3mr_free_mem()
4735 mrioc->init_cmds.reply = NULL; in mpi3mr_free_mem()
4737 kfree(mrioc->bsg_cmds.reply); in mpi3mr_free_mem()
4738 mrioc->bsg_cmds.reply = NULL; in mpi3mr_free_mem()
4740 kfree(mrioc->host_tm_cmds.reply); in mpi3mr_free_mem()
4741 mrioc->host_tm_cmds.reply = NULL; in mpi3mr_free_mem()
4743 kfree(mrioc->pel_cmds.reply); in mpi3mr_free_mem()
4744 mrioc->pel_cmds.reply = NULL; in mpi3mr_free_mem()
4746 kfree(mrioc->pel_abort_cmd.reply); in mpi3mr_free_mem()
4747 mrioc->pel_abort_cmd.reply = NULL; in mpi3mr_free_mem()
4750 kfree(mrioc->evtack_cmds[i].reply); in mpi3mr_free_mem()
4751 mrioc->evtack_cmds[i].reply = NULL; in mpi3mr_free_mem()
4754 bitmap_free(mrioc->removepend_bitmap); in mpi3mr_free_mem()
4755 mrioc->removepend_bitmap = NULL; in mpi3mr_free_mem()
4757 bitmap_free(mrioc->devrem_bitmap); in mpi3mr_free_mem()
4758 mrioc->devrem_bitmap = NULL; in mpi3mr_free_mem()
4760 bitmap_free(mrioc->evtack_cmds_bitmap); in mpi3mr_free_mem()
4761 mrioc->evtack_cmds_bitmap = NULL; in mpi3mr_free_mem()
4763 bitmap_free(mrioc->chain_bitmap); in mpi3mr_free_mem()
4764 mrioc->chain_bitmap = NULL; in mpi3mr_free_mem()
4766 kfree(mrioc->transport_cmds.reply); in mpi3mr_free_mem()
4767 mrioc->transport_cmds.reply = NULL; in mpi3mr_free_mem()
4770 kfree(mrioc->dev_rmhs_cmds[i].reply); in mpi3mr_free_mem()
4771 mrioc->dev_rmhs_cmds[i].reply = NULL; in mpi3mr_free_mem()
4774 if (mrioc->chain_buf_pool) { in mpi3mr_free_mem()
4775 for (i = 0; i < mrioc->chain_buf_count; i++) { in mpi3mr_free_mem()
4776 if (mrioc->chain_sgl_list[i].addr) { in mpi3mr_free_mem()
4777 dma_pool_free(mrioc->chain_buf_pool, in mpi3mr_free_mem()
4778 mrioc->chain_sgl_list[i].addr, in mpi3mr_free_mem()
4779 mrioc->chain_sgl_list[i].dma_addr); in mpi3mr_free_mem()
4780 mrioc->chain_sgl_list[i].addr = NULL; in mpi3mr_free_mem()
4783 dma_pool_destroy(mrioc->chain_buf_pool); in mpi3mr_free_mem()
4784 mrioc->chain_buf_pool = NULL; in mpi3mr_free_mem()
4787 kfree(mrioc->chain_sgl_list); in mpi3mr_free_mem()
4788 mrioc->chain_sgl_list = NULL; in mpi3mr_free_mem()
4790 if (mrioc->admin_reply_base) { in mpi3mr_free_mem()
4791 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_reply_q_sz, in mpi3mr_free_mem()
4792 mrioc->admin_reply_base, mrioc->admin_reply_dma); in mpi3mr_free_mem()
4793 mrioc->admin_reply_base = NULL; in mpi3mr_free_mem()
4795 if (mrioc->admin_req_base) { in mpi3mr_free_mem()
4796 dma_free_coherent(&mrioc->pdev->dev, mrioc->admin_req_q_sz, in mpi3mr_free_mem()
4797 mrioc->admin_req_base, mrioc->admin_req_dma); in mpi3mr_free_mem()
4798 mrioc->admin_req_base = NULL; in mpi3mr_free_mem()
4801 if (mrioc->pel_seqnum_virt) { in mpi3mr_free_mem()
4802 dma_free_coherent(&mrioc->pdev->dev, mrioc->pel_seqnum_sz, in mpi3mr_free_mem()
4803 mrioc->pel_seqnum_virt, mrioc->pel_seqnum_dma); in mpi3mr_free_mem()
4804 mrioc->pel_seqnum_virt = NULL; in mpi3mr_free_mem()
4808 diag_buffer = &mrioc->diag_buffers[i]; in mpi3mr_free_mem()
4810 dma_free_coherent(&mrioc->pdev->dev, in mpi3mr_free_mem()
4820 kfree(mrioc->throttle_groups); in mpi3mr_free_mem()
4821 mrioc->throttle_groups = NULL; in mpi3mr_free_mem()
4823 kfree(mrioc->logdata_buf); in mpi3mr_free_mem()
4824 mrioc->logdata_buf = NULL; in mpi3mr_free_mem()
4837 static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc) in mpi3mr_issue_ioc_shutdown() argument
4843 ioc_info(mrioc, "Issuing shutdown Notification\n"); in mpi3mr_issue_ioc_shutdown()
4844 if (mrioc->unrecoverable) { in mpi3mr_issue_ioc_shutdown()
4845 ioc_warn(mrioc, in mpi3mr_issue_ioc_shutdown()
4849 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4852 ioc_info(mrioc, "shutdown already in progress\n"); in mpi3mr_issue_ioc_shutdown()
4856 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4860 writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4862 if (mrioc->facts.shutdown_timeout) in mpi3mr_issue_ioc_shutdown()
4863 timeout = mrioc->facts.shutdown_timeout * 10; in mpi3mr_issue_ioc_shutdown()
4866 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4875 ioc_status = readl(&mrioc->sysif_regs->ioc_status); in mpi3mr_issue_ioc_shutdown()
4876 ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); in mpi3mr_issue_ioc_shutdown()
4881 ioc_warn(mrioc, in mpi3mr_issue_ioc_shutdown()
4885 ioc_info(mrioc, in mpi3mr_issue_ioc_shutdown()
4900 void mpi3mr_cleanup_ioc(struct mpi3mr_ioc *mrioc) in mpi3mr_cleanup_ioc() argument
4904 dprint_exit(mrioc, "cleaning up the controller\n"); in mpi3mr_cleanup_ioc()
4905 mpi3mr_ioc_disable_intr(mrioc); in mpi3mr_cleanup_ioc()
4907 ioc_state = mpi3mr_get_iocstate(mrioc); in mpi3mr_cleanup_ioc()
4909 if (!mrioc->unrecoverable && !mrioc->reset_in_progress && in mpi3mr_cleanup_ioc()
4910 !mrioc->pci_err_recovery && in mpi3mr_cleanup_ioc()
4912 if (mpi3mr_issue_and_process_mur(mrioc, in mpi3mr_cleanup_ioc()
4914 mpi3mr_issue_reset(mrioc, in mpi3mr_cleanup_ioc()
4917 mpi3mr_issue_ioc_shutdown(mrioc); in mpi3mr_cleanup_ioc()
4919 dprint_exit(mrioc, "controller cleanup completed\n"); in mpi3mr_cleanup_ioc()
4932 static inline void mpi3mr_drv_cmd_comp_reset(struct mpi3mr_ioc *mrioc, in mpi3mr_drv_cmd_comp_reset() argument
4942 cmdptr->callback(mrioc, cmdptr); in mpi3mr_drv_cmd_comp_reset()
4954 void mpi3mr_flush_drv_cmds(struct mpi3mr_ioc *mrioc) in mpi3mr_flush_drv_cmds() argument
4959 cmdptr = &mrioc->init_cmds; in mpi3mr_flush_drv_cmds()
4960 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4962 cmdptr = &mrioc->cfg_cmds; in mpi3mr_flush_drv_cmds()
4963 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4965 cmdptr = &mrioc->bsg_cmds; in mpi3mr_flush_drv_cmds()
4966 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4967 cmdptr = &mrioc->host_tm_cmds; in mpi3mr_flush_drv_cmds()
4968 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4971 cmdptr = &mrioc->dev_rmhs_cmds[i]; in mpi3mr_flush_drv_cmds()
4972 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4976 cmdptr = &mrioc->evtack_cmds[i]; in mpi3mr_flush_drv_cmds()
4977 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4980 cmdptr = &mrioc->pel_cmds; in mpi3mr_flush_drv_cmds()
4981 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4983 cmdptr = &mrioc->pel_abort_cmd; in mpi3mr_flush_drv_cmds()
4984 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4986 cmdptr = &mrioc->transport_cmds; in mpi3mr_flush_drv_cmds()
4987 mpi3mr_drv_cmd_comp_reset(mrioc, cmdptr); in mpi3mr_flush_drv_cmds()
4999 static void mpi3mr_pel_wait_post(struct mpi3mr_ioc *mrioc, in mpi3mr_pel_wait_post() argument
5004 mrioc->pel_abort_requested = false; in mpi3mr_pel_wait_post()
5015 pel_wait.starting_sequence_number = cpu_to_le32(mrioc->pel_newest_seqnum); in mpi3mr_pel_wait_post()
5016 pel_wait.locale = cpu_to_le16(mrioc->pel_locale); in mpi3mr_pel_wait_post()
5017 pel_wait.class = cpu_to_le16(mrioc->pel_class); in mpi3mr_pel_wait_post()
5019 dprint_bsg_info(mrioc, "sending pel_wait seqnum(%d), class(%d), locale(0x%08x)\n", in mpi3mr_pel_wait_post()
5020 mrioc->pel_newest_seqnum, mrioc->pel_class, mrioc->pel_locale); in mpi3mr_pel_wait_post()
5022 if (mpi3mr_admin_request_post(mrioc, &pel_wait, sizeof(pel_wait), 0)) { in mpi3mr_pel_wait_post()
5023 dprint_bsg_err(mrioc, in mpi3mr_pel_wait_post()
5028 mrioc->pel_enabled = false; in mpi3mr_pel_wait_post()
5042 int mpi3mr_pel_get_seqnum_post(struct mpi3mr_ioc *mrioc, in mpi3mr_pel_get_seqnum_post() argument
5050 mrioc->pel_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_pel_get_seqnum_post()
5051 mrioc->pel_cmds.is_waiting = 0; in mpi3mr_pel_get_seqnum_post()
5052 mrioc->pel_cmds.ioc_status = 0; in mpi3mr_pel_get_seqnum_post()
5053 mrioc->pel_cmds.ioc_loginfo = 0; in mpi3mr_pel_get_seqnum_post()
5054 mrioc->pel_cmds.callback = mpi3mr_pel_get_seqnum_complete; in mpi3mr_pel_get_seqnum_post()
5059 mrioc->pel_seqnum_sz, mrioc->pel_seqnum_dma); in mpi3mr_pel_get_seqnum_post()
5061 retval = mpi3mr_admin_request_post(mrioc, &pel_getseq_req, in mpi3mr_pel_get_seqnum_post()
5069 mrioc->pel_enabled = false; in mpi3mr_pel_get_seqnum_post()
5088 static void mpi3mr_pel_wait_complete(struct mpi3mr_ioc *mrioc, in mpi3mr_pel_wait_complete() argument
5100 ioc_err(mrioc, "%s: Failed ioc_status(0x%04x) Loginfo(0x%08x)\n", in mpi3mr_pel_wait_complete()
5102 dprint_bsg_err(mrioc, in mpi3mr_pel_wait_complete()
5112 dprint_bsg_err(mrioc, in mpi3mr_pel_wait_complete()
5120 ioc_err(mrioc, "%s: Failed pe_log_status(0x%04x)\n", in mpi3mr_pel_wait_complete()
5122 dprint_bsg_err(mrioc, in mpi3mr_pel_wait_complete()
5131 dprint_bsg_err(mrioc, "pel_wait: retrying(%d)\n", in mpi3mr_pel_wait_complete()
5133 mpi3mr_pel_wait_post(mrioc, drv_cmd); in mpi3mr_pel_wait_complete()
5136 dprint_bsg_err(mrioc, in mpi3mr_pel_wait_complete()
5142 if (!mrioc->pel_abort_requested) { in mpi3mr_pel_wait_complete()
5143 mrioc->pel_cmds.retry_count = 0; in mpi3mr_pel_wait_complete()
5144 mpi3mr_pel_get_seqnum_post(mrioc, &mrioc->pel_cmds); in mpi3mr_pel_wait_complete()
5149 mrioc->pel_enabled = false; in mpi3mr_pel_wait_complete()
5167 void mpi3mr_pel_get_seqnum_complete(struct mpi3mr_ioc *mrioc, in mpi3mr_pel_get_seqnum_complete() argument
5175 pel_seqnum_virt = (struct mpi3_pel_seq *)mrioc->pel_seqnum_virt; in mpi3mr_pel_get_seqnum_complete()
5182 dprint_bsg_err(mrioc, in mpi3mr_pel_get_seqnum_complete()
5191 dprint_bsg_err(mrioc, in mpi3mr_pel_get_seqnum_complete()
5197 dprint_bsg_err(mrioc, in mpi3mr_pel_get_seqnum_complete()
5206 dprint_bsg_err(mrioc, in mpi3mr_pel_get_seqnum_complete()
5209 mpi3mr_pel_get_seqnum_post(mrioc, drv_cmd); in mpi3mr_pel_get_seqnum_complete()
5213 dprint_bsg_err(mrioc, in mpi3mr_pel_get_seqnum_complete()
5218 mrioc->pel_newest_seqnum = le32_to_cpu(pel_seqnum_virt->newest) + 1; in mpi3mr_pel_get_seqnum_complete()
5220 mpi3mr_pel_wait_post(mrioc, drv_cmd); in mpi3mr_pel_get_seqnum_complete()
5224 mrioc->pel_enabled = false; in mpi3mr_pel_get_seqnum_complete()
5252 int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, in mpi3mr_soft_reset_handler() argument
5261 dprint_reset(mrioc, in mpi3mr_soft_reset_handler()
5263 mrioc->diagsave_timeout); in mpi3mr_soft_reset_handler()
5264 while (mrioc->diagsave_timeout) in mpi3mr_soft_reset_handler()
5270 dprint_reset(mrioc, "soft_reset_handler: acquiring reset_mutex\n"); in mpi3mr_soft_reset_handler()
5271 if (!mutex_trylock(&mrioc->reset_mutex)) { in mpi3mr_soft_reset_handler()
5272 ioc_info(mrioc, in mpi3mr_soft_reset_handler()
5277 } while (mrioc->reset_in_progress == 1); in mpi3mr_soft_reset_handler()
5278 ioc_info(mrioc, in mpi3mr_soft_reset_handler()
5280 mrioc->prev_reset_result, in mpi3mr_soft_reset_handler()
5282 return mrioc->prev_reset_result; in mpi3mr_soft_reset_handler()
5284 ioc_info(mrioc, "controller reset is triggered by %s\n", in mpi3mr_soft_reset_handler()
5287 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
5288 mrioc->reset_in_progress = 1; in mpi3mr_soft_reset_handler()
5289 mrioc->stop_bsgs = 1; in mpi3mr_soft_reset_handler()
5290 mrioc->prev_reset_result = -1; in mpi3mr_soft_reset_handler()
5296 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_soft_reset_handler()
5298 dprint_reset(mrioc, in mpi3mr_soft_reset_handler()
5300 mpi3mr_release_diag_bufs(mrioc, 0); in mpi3mr_soft_reset_handler()
5302 mrioc->event_masks[i] = -1; in mpi3mr_soft_reset_handler()
5304 dprint_reset(mrioc, "soft_reset_handler: masking events\n"); in mpi3mr_soft_reset_handler()
5305 mpi3mr_issue_event_notification(mrioc); in mpi3mr_soft_reset_handler()
5308 mpi3mr_wait_for_host_io(mrioc, MPI3MR_RESET_HOST_IOWAIT_TIMEOUT); in mpi3mr_soft_reset_handler()
5310 mpi3mr_ioc_disable_intr(mrioc); in mpi3mr_soft_reset_handler()
5313 mpi3mr_set_diagsave(mrioc); in mpi3mr_soft_reset_handler()
5314 retval = mpi3mr_issue_reset(mrioc, in mpi3mr_soft_reset_handler()
5317 trigger_data.fault = (readl(&mrioc->sysif_regs->fault) & in mpi3mr_soft_reset_handler()
5321 readl(&mrioc->sysif_regs->host_diagnostic); in mpi3mr_soft_reset_handler()
5327 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_soft_reset_handler()
5332 retval = mpi3mr_issue_reset(mrioc, in mpi3mr_soft_reset_handler()
5335 ioc_err(mrioc, "Failed to issue soft reset to the ioc\n"); in mpi3mr_soft_reset_handler()
5338 if (mrioc->num_io_throttle_group != in mpi3mr_soft_reset_handler()
5339 mrioc->facts.max_io_throttle_group) { in mpi3mr_soft_reset_handler()
5340 ioc_err(mrioc, in mpi3mr_soft_reset_handler()
5342 mrioc->num_io_throttle_group, in mpi3mr_soft_reset_handler()
5343 mrioc->facts.max_io_throttle_group); in mpi3mr_soft_reset_handler()
5348 mpi3mr_flush_delayed_cmd_lists(mrioc); in mpi3mr_soft_reset_handler()
5349 mpi3mr_flush_drv_cmds(mrioc); in mpi3mr_soft_reset_handler()
5350 bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD); in mpi3mr_soft_reset_handler()
5351 bitmap_clear(mrioc->removepend_bitmap, 0, in mpi3mr_soft_reset_handler()
5352 mrioc->dev_handle_bitmap_bits); in mpi3mr_soft_reset_handler()
5353 bitmap_clear(mrioc->evtack_cmds_bitmap, 0, MPI3MR_NUM_EVTACKCMD); in mpi3mr_soft_reset_handler()
5354 mpi3mr_flush_host_io(mrioc); in mpi3mr_soft_reset_handler()
5355 mpi3mr_cleanup_fwevt_list(mrioc); in mpi3mr_soft_reset_handler()
5356 mpi3mr_invalidate_devhandles(mrioc); in mpi3mr_soft_reset_handler()
5357 mpi3mr_free_enclosure_list(mrioc); in mpi3mr_soft_reset_handler()
5359 if (mrioc->prepare_for_reset) { in mpi3mr_soft_reset_handler()
5360 mrioc->prepare_for_reset = 0; in mpi3mr_soft_reset_handler()
5361 mrioc->prepare_for_reset_timeout_counter = 0; in mpi3mr_soft_reset_handler()
5363 mpi3mr_memset_buffers(mrioc); in mpi3mr_soft_reset_handler()
5364 mpi3mr_release_diag_bufs(mrioc, 1); in mpi3mr_soft_reset_handler()
5365 mrioc->fw_release_trigger_active = false; in mpi3mr_soft_reset_handler()
5366 mrioc->trace_release_trigger_active = false; in mpi3mr_soft_reset_handler()
5367 mrioc->snapdump_trigger_active = false; in mpi3mr_soft_reset_handler()
5368 mpi3mr_set_trigger_data_in_all_hdb(mrioc, in mpi3mr_soft_reset_handler()
5371 dprint_reset(mrioc, in mpi3mr_soft_reset_handler()
5373 retval = mpi3mr_reinit_ioc(mrioc, 0); in mpi3mr_soft_reset_handler()
5376 mrioc->name, reset_reason); in mpi3mr_soft_reset_handler()
5383 mrioc->diagsave_timeout = 0; in mpi3mr_soft_reset_handler()
5384 mrioc->reset_in_progress = 0; in mpi3mr_soft_reset_handler()
5385 mrioc->pel_abort_requested = 0; in mpi3mr_soft_reset_handler()
5386 if (mrioc->pel_enabled) { in mpi3mr_soft_reset_handler()
5387 mrioc->pel_cmds.retry_count = 0; in mpi3mr_soft_reset_handler()
5388 mpi3mr_pel_wait_post(mrioc, &mrioc->pel_cmds); in mpi3mr_soft_reset_handler()
5391 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
5393 mrioc->ts_update_counter = 0; in mpi3mr_soft_reset_handler()
5394 spin_lock_irqsave(&mrioc->watchdog_lock, flags); in mpi3mr_soft_reset_handler()
5395 if (mrioc->watchdog_work_q) in mpi3mr_soft_reset_handler()
5396 queue_delayed_work(mrioc->watchdog_work_q, in mpi3mr_soft_reset_handler()
5397 &mrioc->watchdog_work, in mpi3mr_soft_reset_handler()
5399 spin_unlock_irqrestore(&mrioc->watchdog_lock, flags); in mpi3mr_soft_reset_handler()
5400 mrioc->stop_bsgs = 0; in mpi3mr_soft_reset_handler()
5401 if (mrioc->pel_enabled) in mpi3mr_soft_reset_handler()
5404 mpi3mr_issue_reset(mrioc, in mpi3mr_soft_reset_handler()
5406 mrioc->device_refresh_on = 0; in mpi3mr_soft_reset_handler()
5407 mrioc->unrecoverable = 1; in mpi3mr_soft_reset_handler()
5408 mrioc->reset_in_progress = 0; in mpi3mr_soft_reset_handler()
5409 mrioc->stop_bsgs = 0; in mpi3mr_soft_reset_handler()
5411 mpi3mr_flush_cmds_for_unrecovered_controller(mrioc); in mpi3mr_soft_reset_handler()
5413 mrioc->prev_reset_result = retval; in mpi3mr_soft_reset_handler()
5414 mutex_unlock(&mrioc->reset_mutex); in mpi3mr_soft_reset_handler()
5415 ioc_info(mrioc, "controller reset is %s\n", in mpi3mr_soft_reset_handler()
5437 static int mpi3mr_post_cfg_req(struct mpi3mr_ioc *mrioc, in mpi3mr_post_cfg_req() argument
5442 mutex_lock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5443 if (mrioc->cfg_cmds.state & MPI3MR_CMD_PENDING) { in mpi3mr_post_cfg_req()
5445 ioc_err(mrioc, "sending config request failed due to command in use\n"); in mpi3mr_post_cfg_req()
5446 mutex_unlock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5449 mrioc->cfg_cmds.state = MPI3MR_CMD_PENDING; in mpi3mr_post_cfg_req()
5450 mrioc->cfg_cmds.is_waiting = 1; in mpi3mr_post_cfg_req()
5451 mrioc->cfg_cmds.callback = NULL; in mpi3mr_post_cfg_req()
5452 mrioc->cfg_cmds.ioc_status = 0; in mpi3mr_post_cfg_req()
5453 mrioc->cfg_cmds.ioc_loginfo = 0; in mpi3mr_post_cfg_req()
5458 init_completion(&mrioc->cfg_cmds.done); in mpi3mr_post_cfg_req()
5459 dprint_cfg_info(mrioc, "posting config request\n"); in mpi3mr_post_cfg_req()
5460 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_post_cfg_req()
5463 retval = mpi3mr_admin_request_post(mrioc, cfg_req, sizeof(*cfg_req), 1); in mpi3mr_post_cfg_req()
5465 ioc_err(mrioc, "posting config request failed\n"); in mpi3mr_post_cfg_req()
5468 wait_for_completion_timeout(&mrioc->cfg_cmds.done, (timeout * HZ)); in mpi3mr_post_cfg_req()
5469 if (!(mrioc->cfg_cmds.state & MPI3MR_CMD_COMPLETE)) { in mpi3mr_post_cfg_req()
5470 mpi3mr_check_rh_fault_ioc(mrioc, in mpi3mr_post_cfg_req()
5472 ioc_err(mrioc, "config request timed out\n"); in mpi3mr_post_cfg_req()
5476 *ioc_status = mrioc->cfg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK; in mpi3mr_post_cfg_req()
5478 dprint_cfg_err(mrioc, in mpi3mr_post_cfg_req()
5480 *ioc_status, mrioc->cfg_cmds.ioc_loginfo); in mpi3mr_post_cfg_req()
5483 mrioc->cfg_cmds.state = MPI3MR_CMD_NOTUSED; in mpi3mr_post_cfg_req()
5484 mutex_unlock(&mrioc->cfg_cmds.mutex); in mpi3mr_post_cfg_req()
5526 static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc, in mpi3mr_process_cfg_req() argument
5542 …ioc_err(mrioc, "null config header passed for config action(%d), page_type(0x%02x), page_num(%d)\n… in mpi3mr_process_cfg_req()
5565 ioc_err(mrioc, in mpi3mr_process_cfg_req()
5576 mem_desc.addr = dma_alloc_coherent(&mrioc->pdev->dev, in mpi3mr_process_cfg_req()
5589 dprint_cfg_info(mrioc, "config buffer to be written\n"); in mpi3mr_process_cfg_req()
5590 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_process_cfg_req()
5594 if (mpi3mr_post_cfg_req(mrioc, cfg_req, timeout, ioc_status)) in mpi3mr_process_cfg_req()
5603 dprint_cfg_info(mrioc, "config buffer read\n"); in mpi3mr_process_cfg_req()
5604 if (mrioc->logging_level & MPI3_DEBUG_CFG_INFO) in mpi3mr_process_cfg_req()
5610 dma_free_coherent(&mrioc->pdev->dev, mem_desc.size, in mpi3mr_process_cfg_req()
5635 int mpi3mr_cfg_get_dev_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_dev_pg0() argument
5652 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_dev_pg0()
5654 ioc_err(mrioc, "device page0 header read failed\n"); in mpi3mr_cfg_get_dev_pg0()
5658 ioc_err(mrioc, "device page0 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_dev_pg0()
5666 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_dev_pg0()
5668 ioc_err(mrioc, "device page0 read failed\n"); in mpi3mr_cfg_get_dev_pg0()
5694 int mpi3mr_cfg_get_sas_phy_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_sas_phy_pg0() argument
5712 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_phy_pg0()
5714 ioc_err(mrioc, "sas phy page0 header read failed\n"); in mpi3mr_cfg_get_sas_phy_pg0()
5718 ioc_err(mrioc, "sas phy page0 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_phy_pg0()
5726 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_phy_pg0()
5728 ioc_err(mrioc, "sas phy page0 read failed\n"); in mpi3mr_cfg_get_sas_phy_pg0()
5753 int mpi3mr_cfg_get_sas_phy_pg1(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_sas_phy_pg1() argument
5771 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_phy_pg1()
5773 ioc_err(mrioc, "sas phy page1 header read failed\n"); in mpi3mr_cfg_get_sas_phy_pg1()
5777 ioc_err(mrioc, "sas phy page1 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_phy_pg1()
5785 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_phy_pg1()
5787 ioc_err(mrioc, "sas phy page1 read failed\n"); in mpi3mr_cfg_get_sas_phy_pg1()
5813 int mpi3mr_cfg_get_sas_exp_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_sas_exp_pg0() argument
5831 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_exp_pg0()
5833 ioc_err(mrioc, "expander page0 header read failed\n"); in mpi3mr_cfg_get_sas_exp_pg0()
5837 ioc_err(mrioc, "expander page0 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_exp_pg0()
5846 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_exp_pg0()
5848 ioc_err(mrioc, "expander page0 read failed\n"); in mpi3mr_cfg_get_sas_exp_pg0()
5873 int mpi3mr_cfg_get_sas_exp_pg1(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_sas_exp_pg1() argument
5891 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_exp_pg1()
5893 ioc_err(mrioc, "expander page1 header read failed\n"); in mpi3mr_cfg_get_sas_exp_pg1()
5897 ioc_err(mrioc, "expander page1 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_exp_pg1()
5906 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_exp_pg1()
5908 ioc_err(mrioc, "expander page1 read failed\n"); in mpi3mr_cfg_get_sas_exp_pg1()
5933 int mpi3mr_cfg_get_enclosure_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status, in mpi3mr_cfg_get_enclosure_pg0() argument
5951 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_enclosure_pg0()
5953 ioc_err(mrioc, "enclosure page0 header read failed\n"); in mpi3mr_cfg_get_enclosure_pg0()
5957 ioc_err(mrioc, "enclosure page0 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_enclosure_pg0()
5965 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_enclosure_pg0()
5967 ioc_err(mrioc, "enclosure page0 read failed\n"); in mpi3mr_cfg_get_enclosure_pg0()
5988 int mpi3mr_cfg_get_sas_io_unit_pg0(struct mpi3mr_ioc *mrioc, in mpi3mr_cfg_get_sas_io_unit_pg0() argument
6005 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_io_unit_pg0()
6007 ioc_err(mrioc, "sas io unit page0 header read failed\n"); in mpi3mr_cfg_get_sas_io_unit_pg0()
6011 ioc_err(mrioc, "sas io unit page0 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_io_unit_pg0()
6017 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_io_unit_pg0()
6019 ioc_err(mrioc, "sas io unit page0 read failed\n"); in mpi3mr_cfg_get_sas_io_unit_pg0()
6023 ioc_err(mrioc, "sas io unit page0 read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_io_unit_pg0()
6044 int mpi3mr_cfg_get_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc, in mpi3mr_cfg_get_sas_io_unit_pg1() argument
6061 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_sas_io_unit_pg1()
6063 ioc_err(mrioc, "sas io unit page1 header read failed\n"); in mpi3mr_cfg_get_sas_io_unit_pg1()
6067 ioc_err(mrioc, "sas io unit page1 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_io_unit_pg1()
6073 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_sas_io_unit_pg1()
6075 ioc_err(mrioc, "sas io unit page1 read failed\n"); in mpi3mr_cfg_get_sas_io_unit_pg1()
6079 ioc_err(mrioc, "sas io unit page1 read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_sas_io_unit_pg1()
6101 int mpi3mr_cfg_set_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc, in mpi3mr_cfg_set_sas_io_unit_pg1() argument
6117 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_set_sas_io_unit_pg1()
6119 ioc_err(mrioc, "sas io unit page1 header read failed\n"); in mpi3mr_cfg_set_sas_io_unit_pg1()
6123 ioc_err(mrioc, "sas io unit page1 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_set_sas_io_unit_pg1()
6129 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_set_sas_io_unit_pg1()
6131 ioc_err(mrioc, "sas io unit page1 write current failed\n"); in mpi3mr_cfg_set_sas_io_unit_pg1()
6135 ioc_err(mrioc, "sas io unit page1 write current failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_set_sas_io_unit_pg1()
6142 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_set_sas_io_unit_pg1()
6144 ioc_err(mrioc, "sas io unit page1 write persistent failed\n"); in mpi3mr_cfg_set_sas_io_unit_pg1()
6148 ioc_err(mrioc, "sas io unit page1 write persistent failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_set_sas_io_unit_pg1()
6169 int mpi3mr_cfg_get_driver_pg1(struct mpi3mr_ioc *mrioc, in mpi3mr_cfg_get_driver_pg1() argument
6186 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_driver_pg1()
6188 ioc_err(mrioc, "driver page1 header read failed\n"); in mpi3mr_cfg_get_driver_pg1()
6192 ioc_err(mrioc, "driver page1 header read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_driver_pg1()
6198 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_driver_pg1()
6200 ioc_err(mrioc, "driver page1 read failed\n"); in mpi3mr_cfg_get_driver_pg1()
6204 ioc_err(mrioc, "driver page1 read failed with ioc_status(0x%04x)\n", in mpi3mr_cfg_get_driver_pg1()
6226 int mpi3mr_cfg_get_driver_pg2(struct mpi3mr_ioc *mrioc, in mpi3mr_cfg_get_driver_pg2() argument
6244 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, NULL, in mpi3mr_cfg_get_driver_pg2()
6246 ioc_err(mrioc, "driver page2 header read failed\n"); in mpi3mr_cfg_get_driver_pg2()
6250 ioc_err(mrioc, "driver page2 header read failed with\n" in mpi3mr_cfg_get_driver_pg2()
6257 if (mpi3mr_process_cfg_req(mrioc, &cfg_req, &cfg_hdr, in mpi3mr_cfg_get_driver_pg2()
6259 ioc_err(mrioc, "driver page2 read failed\n"); in mpi3mr_cfg_get_driver_pg2()
6263 ioc_err(mrioc, "driver page2 read failed with\n" in mpi3mr_cfg_get_driver_pg2()