• Home
  • Raw
  • Download

Lines Matching +full:cpu +full:- +full:centric

4  * Copyright (C) 2017-2018 Broadcom. All Rights Reserved. The term *
6 * Copyright (C) 2004-2016 Emulex. All rights reserved. *
9 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
17 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
26 #include <linux/dma-mapping.h>
49 #include <linux/nvme-fc-driver.h>
73 /* Used when mapping IRQ vectors in a driver centric manner */
103 * lpfc_config_port_prep - Perform lpfc initialization prior to config port
112 * 0 - success.
113 * -ERESTART - requests the SLI layer to reset the HBA and try again.
114 * Any other value - indicates an error.
119 lpfc_vpd_t *vp = &phba->vpd; in lpfc_config_port_prep()
129 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_config_port_prep()
131 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_prep()
132 return -ENOMEM; in lpfc_config_port_prep()
135 mb = &pmb->u.mb; in lpfc_config_port_prep()
136 phba->link_state = LPFC_INIT_MBX_CMDS; in lpfc_config_port_prep()
138 if (lpfc_is_LC_HBA(phba->pcidev->device)) { in lpfc_config_port_prep()
148 memset((char*)mb->un.varRDnvp.rsvd3, 0, in lpfc_config_port_prep()
149 sizeof (mb->un.varRDnvp.rsvd3)); in lpfc_config_port_prep()
150 memcpy((char*)mb->un.varRDnvp.rsvd3, licensed, in lpfc_config_port_prep()
160 mb->mbxCommand, mb->mbxStatus); in lpfc_config_port_prep()
161 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_prep()
162 return -ERESTART; in lpfc_config_port_prep()
164 memcpy(phba->wwnn, (char *)mb->un.varRDnvp.nodename, in lpfc_config_port_prep()
165 sizeof(phba->wwnn)); in lpfc_config_port_prep()
166 memcpy(phba->wwpn, (char *)mb->un.varRDnvp.portname, in lpfc_config_port_prep()
167 sizeof(phba->wwpn)); in lpfc_config_port_prep()
174 phba->sli3_options &= (uint32_t)LPFC_SLI3_BG_ENABLED; in lpfc_config_port_prep()
183 mb->mbxCommand, mb->mbxStatus); in lpfc_config_port_prep()
184 mempool_free( pmb, phba->mbox_mem_pool); in lpfc_config_port_prep()
185 return -ERESTART; in lpfc_config_port_prep()
193 if (mb->un.varRdRev.rr == 0) { in lpfc_config_port_prep()
194 vp->rev.rBit = 0; in lpfc_config_port_prep()
198 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_prep()
199 return -ERESTART; in lpfc_config_port_prep()
202 if (phba->sli_rev == 3 && !mb->un.varRdRev.v3rsp) { in lpfc_config_port_prep()
203 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_prep()
204 return -EINVAL; in lpfc_config_port_prep()
208 vp->rev.rBit = 1; in lpfc_config_port_prep()
209 memcpy(&vp->sli3Feat, &mb->un.varRdRev.sli3Feat, sizeof(uint32_t)); in lpfc_config_port_prep()
210 vp->rev.sli1FwRev = mb->un.varRdRev.sli1FwRev; in lpfc_config_port_prep()
211 memcpy(vp->rev.sli1FwName, (char*) mb->un.varRdRev.sli1FwName, 16); in lpfc_config_port_prep()
212 vp->rev.sli2FwRev = mb->un.varRdRev.sli2FwRev; in lpfc_config_port_prep()
213 memcpy(vp->rev.sli2FwName, (char *) mb->un.varRdRev.sli2FwName, 16); in lpfc_config_port_prep()
214 vp->rev.biuRev = mb->un.varRdRev.biuRev; in lpfc_config_port_prep()
215 vp->rev.smRev = mb->un.varRdRev.smRev; in lpfc_config_port_prep()
216 vp->rev.smFwRev = mb->un.varRdRev.un.smFwRev; in lpfc_config_port_prep()
217 vp->rev.endecRev = mb->un.varRdRev.endecRev; in lpfc_config_port_prep()
218 vp->rev.fcphHigh = mb->un.varRdRev.fcphHigh; in lpfc_config_port_prep()
219 vp->rev.fcphLow = mb->un.varRdRev.fcphLow; in lpfc_config_port_prep()
220 vp->rev.feaLevelHigh = mb->un.varRdRev.feaLevelHigh; in lpfc_config_port_prep()
221 vp->rev.feaLevelLow = mb->un.varRdRev.feaLevelLow; in lpfc_config_port_prep()
222 vp->rev.postKernRev = mb->un.varRdRev.postKernRev; in lpfc_config_port_prep()
223 vp->rev.opFwRev = mb->un.varRdRev.opFwRev; in lpfc_config_port_prep()
229 if (vp->rev.feaLevelHigh < 9) in lpfc_config_port_prep()
230 phba->sli3_options |= LPFC_SLI3_VPORT_TEARDOWN; in lpfc_config_port_prep()
232 if (lpfc_is_LC_HBA(phba->pcidev->device)) in lpfc_config_port_prep()
233 memcpy(phba->RandomData, (char *)&mb->un.varWords[24], in lpfc_config_port_prep()
234 sizeof (phba->RandomData)); in lpfc_config_port_prep()
248 mb->mbxCommand, mb->mbxStatus); in lpfc_config_port_prep()
249 mb->un.varDmp.word_cnt = 0; in lpfc_config_port_prep()
254 if (mb->un.varDmp.word_cnt == 0) in lpfc_config_port_prep()
256 if (mb->un.varDmp.word_cnt > DMP_VPD_SIZE - offset) in lpfc_config_port_prep()
257 mb->un.varDmp.word_cnt = DMP_VPD_SIZE - offset; in lpfc_config_port_prep()
260 mb->un.varDmp.word_cnt); in lpfc_config_port_prep()
261 offset += mb->un.varDmp.word_cnt; in lpfc_config_port_prep()
262 } while (mb->un.varDmp.word_cnt && offset < DMP_VPD_SIZE); in lpfc_config_port_prep()
267 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_prep()
272 * lpfc_config_async_cmpl - Completion handler for config async event mbox cmd
284 if (pmboxq->u.mb.mbxStatus == MBX_SUCCESS) in lpfc_config_async_cmpl()
285 phba->temp_sensor_support = 1; in lpfc_config_async_cmpl()
287 phba->temp_sensor_support = 0; in lpfc_config_async_cmpl()
288 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_config_async_cmpl()
293 * lpfc_dump_wakeup_param_cmpl - dump memory mailbox command completion handler
311 if (pmboxq->u.mb.mbxStatus != MBX_SUCCESS) { in lpfc_dump_wakeup_param_cmpl()
312 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_dump_wakeup_param_cmpl()
319 prog_id_word = pmboxq->u.mb.un.varWords[7]; in lpfc_dump_wakeup_param_cmpl()
322 if (prg->dist < 4) in lpfc_dump_wakeup_param_cmpl()
323 dist = dist_char[prg->dist]; in lpfc_dump_wakeup_param_cmpl()
325 if ((prg->dist == 3) && (prg->num == 0)) in lpfc_dump_wakeup_param_cmpl()
326 snprintf(phba->OptionROMVersion, 32, "%d.%d%d", in lpfc_dump_wakeup_param_cmpl()
327 prg->ver, prg->rev, prg->lev); in lpfc_dump_wakeup_param_cmpl()
329 snprintf(phba->OptionROMVersion, 32, "%d.%d%d%c%d", in lpfc_dump_wakeup_param_cmpl()
330 prg->ver, prg->rev, prg->lev, in lpfc_dump_wakeup_param_cmpl()
331 dist, prg->num); in lpfc_dump_wakeup_param_cmpl()
332 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_dump_wakeup_param_cmpl()
337 * lpfc_update_vport_wwn - Updates the fc_nodename, fc_portname,
348 uint8_t vvvl = vport->fc_sparam.cmn.valid_vendor_ver_level; in lpfc_update_vport_wwn()
349 u32 *fawwpn_key = (u32 *)&vport->fc_sparam.un.vendorVersion[0]; in lpfc_update_vport_wwn()
352 if (vport->phba->cfg_soft_wwnn) in lpfc_update_vport_wwn()
353 u64_to_wwn(vport->phba->cfg_soft_wwnn, in lpfc_update_vport_wwn()
354 vport->fc_sparam.nodeName.u.wwn); in lpfc_update_vport_wwn()
355 if (vport->phba->cfg_soft_wwpn) in lpfc_update_vport_wwn()
356 u64_to_wwn(vport->phba->cfg_soft_wwpn, in lpfc_update_vport_wwn()
357 vport->fc_sparam.portName.u.wwn); in lpfc_update_vport_wwn()
363 if (vport->fc_nodename.u.wwn[0] == 0 || vport->phba->cfg_soft_wwnn) in lpfc_update_vport_wwn()
364 memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, in lpfc_update_vport_wwn()
367 memcpy(&vport->fc_sparam.nodeName, &vport->fc_nodename, in lpfc_update_vport_wwn()
374 if (vport->fc_portname.u.wwn[0] != 0 && in lpfc_update_vport_wwn()
375 memcmp(&vport->fc_portname, &vport->fc_sparam.portName, in lpfc_update_vport_wwn()
377 vport->vport_flag |= FAWWPN_PARAM_CHG; in lpfc_update_vport_wwn()
379 if (vport->fc_portname.u.wwn[0] == 0 || in lpfc_update_vport_wwn()
380 vport->phba->cfg_soft_wwpn || in lpfc_update_vport_wwn()
382 vport->vport_flag & FAWWPN_SET) { in lpfc_update_vport_wwn()
383 memcpy(&vport->fc_portname, &vport->fc_sparam.portName, in lpfc_update_vport_wwn()
385 vport->vport_flag &= ~FAWWPN_SET; in lpfc_update_vport_wwn()
387 vport->vport_flag |= FAWWPN_SET; in lpfc_update_vport_wwn()
390 memcpy(&vport->fc_sparam.portName, &vport->fc_portname, in lpfc_update_vport_wwn()
395 * lpfc_config_port_post - Perform lpfc initialization after config port
404 * 0 - success.
405 * Any other value - error.
410 struct lpfc_vport *vport = phba->pport; in lpfc_config_port_post()
415 struct lpfc_sli *psli = &phba->sli; in lpfc_config_port_post()
420 spin_lock_irq(&phba->hbalock); in lpfc_config_port_post()
425 if (phba->over_temp_state == HBA_OVER_TEMP) in lpfc_config_port_post()
426 phba->over_temp_state = HBA_NORMAL_TEMP; in lpfc_config_port_post()
427 spin_unlock_irq(&phba->hbalock); in lpfc_config_port_post()
429 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_config_port_post()
431 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_post()
432 return -ENOMEM; in lpfc_config_port_post()
434 mb = &pmb->u.mb; in lpfc_config_port_post()
439 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
440 return -ENOMEM; in lpfc_config_port_post()
443 pmb->vport = vport; in lpfc_config_port_post()
448 mb->mbxCommand, mb->mbxStatus); in lpfc_config_port_post()
449 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_post()
450 mp = (struct lpfc_dmabuf *) pmb->context1; in lpfc_config_port_post()
451 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
452 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_config_port_post()
454 return -EIO; in lpfc_config_port_post()
457 mp = (struct lpfc_dmabuf *) pmb->context1; in lpfc_config_port_post()
459 memcpy(&vport->fc_sparam, mp->virt, sizeof (struct serv_parm)); in lpfc_config_port_post()
460 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_config_port_post()
462 pmb->context1 = NULL; in lpfc_config_port_post()
466 fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); in lpfc_config_port_post()
467 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn); in lpfc_config_port_post()
468 fc_host_max_npiv_vports(shost) = phba->max_vpi; in lpfc_config_port_post()
471 /* This should be consolidated into parse_vpd ? - mr */ in lpfc_config_port_post()
472 if (phba->SerialNumber[0] == 0) { in lpfc_config_port_post()
475 outptr = &vport->fc_nodename.u.s.IEEE[0]; in lpfc_config_port_post()
480 phba->SerialNumber[i] = in lpfc_config_port_post()
483 phba->SerialNumber[i] = in lpfc_config_port_post()
484 (char)((uint8_t) 0x61 + (uint8_t) (j - 10)); in lpfc_config_port_post()
488 phba->SerialNumber[i] = in lpfc_config_port_post()
491 phba->SerialNumber[i] = in lpfc_config_port_post()
492 (char)((uint8_t) 0x61 + (uint8_t) (j - 10)); in lpfc_config_port_post()
497 pmb->vport = vport; in lpfc_config_port_post()
502 mb->mbxCommand, mb->mbxStatus); in lpfc_config_port_post()
503 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_post()
504 mempool_free( pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
505 return -EIO; in lpfc_config_port_post()
512 i = (mb->un.varRdConfig.max_xri + 1); in lpfc_config_port_post()
513 if (phba->cfg_hba_queue_depth > i) { in lpfc_config_port_post()
516 phba->cfg_hba_queue_depth, i); in lpfc_config_port_post()
517 phba->cfg_hba_queue_depth = i; in lpfc_config_port_post()
521 i = (mb->un.varRdConfig.max_xri >> 3); in lpfc_config_port_post()
522 if (phba->pport->cfg_lun_queue_depth > i) { in lpfc_config_port_post()
525 phba->pport->cfg_lun_queue_depth, i); in lpfc_config_port_post()
526 phba->pport->cfg_lun_queue_depth = i; in lpfc_config_port_post()
529 phba->lmt = mb->un.varRdConfig.lmt; in lpfc_config_port_post()
532 lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); in lpfc_config_port_post()
534 phba->link_state = LPFC_LINK_DOWN; in lpfc_config_port_post()
537 if (psli->sli3_ring[LPFC_EXTRA_RING].sli.sli3.cmdringaddr) in lpfc_config_port_post()
538 psli->sli3_ring[LPFC_EXTRA_RING].flag |= LPFC_STOP_IOCB_EVENT; in lpfc_config_port_post()
539 if (psli->sli3_ring[LPFC_FCP_RING].sli.sli3.cmdringaddr) in lpfc_config_port_post()
540 psli->sli3_ring[LPFC_FCP_RING].flag |= LPFC_STOP_IOCB_EVENT; in lpfc_config_port_post()
543 if (phba->sli_rev != 3) in lpfc_config_port_post()
547 * Configure HBA MSI-X attention conditions to messages if MSI-X mode in lpfc_config_port_post()
549 if (phba->intr_type == MSIX) { in lpfc_config_port_post()
552 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
553 return -EIO; in lpfc_config_port_post()
560 pmb->u.mb.mbxCommand, in lpfc_config_port_post()
561 pmb->u.mb.mbxStatus); in lpfc_config_port_post()
562 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
563 return -EIO; in lpfc_config_port_post()
567 spin_lock_irq(&phba->hbalock); in lpfc_config_port_post()
569 phba->hba_flag &= ~HBA_ERATT_HANDLED; in lpfc_config_port_post()
572 if (lpfc_readl(phba->HCregaddr, &status)) { in lpfc_config_port_post()
573 spin_unlock_irq(&phba->hbalock); in lpfc_config_port_post()
574 return -EIO; in lpfc_config_port_post()
577 if (psli->num_rings > 0) in lpfc_config_port_post()
579 if (psli->num_rings > 1) in lpfc_config_port_post()
581 if (psli->num_rings > 2) in lpfc_config_port_post()
583 if (psli->num_rings > 3) in lpfc_config_port_post()
586 if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) && in lpfc_config_port_post()
587 (phba->cfg_poll & DISABLE_FCP_RING_INT)) in lpfc_config_port_post()
590 writel(status, phba->HCregaddr); in lpfc_config_port_post()
591 readl(phba->HCregaddr); /* flush */ in lpfc_config_port_post()
592 spin_unlock_irq(&phba->hbalock); in lpfc_config_port_post()
594 /* Set up ring-0 (ELS) timer */ in lpfc_config_port_post()
595 timeout = phba->fc_ratov * 2; in lpfc_config_port_post()
596 mod_timer(&vport->els_tmofunc, in lpfc_config_port_post()
599 mod_timer(&phba->hb_tmofunc, in lpfc_config_port_post()
601 phba->hb_outstanding = 0; in lpfc_config_port_post()
602 phba->last_completion_time = jiffies; in lpfc_config_port_post()
604 mod_timer(&phba->eratt_poll, in lpfc_config_port_post()
605 jiffies + msecs_to_jiffies(1000 * phba->eratt_poll_interval)); in lpfc_config_port_post()
607 if (phba->hba_flag & LINK_DISABLED) { in lpfc_config_port_post()
612 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_config_port_post()
620 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
621 return -EIO; in lpfc_config_port_post()
623 } else if (phba->cfg_suppress_link_up == LPFC_INITIALIZE_LINK) { in lpfc_config_port_post()
624 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
625 rc = phba->lpfc_hba_init_link(phba, MBX_NOWAIT); in lpfc_config_port_post()
630 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_config_port_post()
632 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_post()
633 return -ENOMEM; in lpfc_config_port_post()
637 pmb->mbox_cmpl = lpfc_config_async_cmpl; in lpfc_config_port_post()
638 pmb->vport = phba->pport; in lpfc_config_port_post()
648 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
652 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_config_port_post()
654 phba->link_state = LPFC_HBA_ERROR; in lpfc_config_port_post()
655 return -ENOMEM; in lpfc_config_port_post()
659 pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl; in lpfc_config_port_post()
660 pmb->vport = phba->pport; in lpfc_config_port_post()
666 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_config_port_post()
673 * lpfc_hba_init_link - Initialize the FC link
675 * @flag: mailbox command issue mode - either MBX_POLL or MBX_NOWAIT
683 * 0 - success
684 * Any other value - error
689 return lpfc_hba_init_link_fc_topology(phba, phba->cfg_topology, flag); in lpfc_hba_init_link()
693 * lpfc_hba_init_link_fc_topology - Initialize FC link with desired topology
696 * @flag: mailbox command issue mode - either MBX_POLL or MBX_NOWAIT
704 * 0 - success
705 * Any other value - error
711 struct lpfc_vport *vport = phba->pport; in lpfc_hba_init_link_fc_topology()
716 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_hba_init_link_fc_topology()
718 phba->link_state = LPFC_HBA_ERROR; in lpfc_hba_init_link_fc_topology()
719 return -ENOMEM; in lpfc_hba_init_link_fc_topology()
721 mb = &pmb->u.mb; in lpfc_hba_init_link_fc_topology()
722 pmb->vport = vport; in lpfc_hba_init_link_fc_topology()
724 if ((phba->cfg_link_speed > LPFC_USER_LINK_SPEED_MAX) || in lpfc_hba_init_link_fc_topology()
725 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_1G) && in lpfc_hba_init_link_fc_topology()
726 !(phba->lmt & LMT_1Gb)) || in lpfc_hba_init_link_fc_topology()
727 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_2G) && in lpfc_hba_init_link_fc_topology()
728 !(phba->lmt & LMT_2Gb)) || in lpfc_hba_init_link_fc_topology()
729 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_4G) && in lpfc_hba_init_link_fc_topology()
730 !(phba->lmt & LMT_4Gb)) || in lpfc_hba_init_link_fc_topology()
731 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_8G) && in lpfc_hba_init_link_fc_topology()
732 !(phba->lmt & LMT_8Gb)) || in lpfc_hba_init_link_fc_topology()
733 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_10G) && in lpfc_hba_init_link_fc_topology()
734 !(phba->lmt & LMT_10Gb)) || in lpfc_hba_init_link_fc_topology()
735 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_16G) && in lpfc_hba_init_link_fc_topology()
736 !(phba->lmt & LMT_16Gb)) || in lpfc_hba_init_link_fc_topology()
737 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_32G) && in lpfc_hba_init_link_fc_topology()
738 !(phba->lmt & LMT_32Gb)) || in lpfc_hba_init_link_fc_topology()
739 ((phba->cfg_link_speed == LPFC_USER_LINK_SPEED_64G) && in lpfc_hba_init_link_fc_topology()
740 !(phba->lmt & LMT_64Gb))) { in lpfc_hba_init_link_fc_topology()
745 phba->cfg_link_speed); in lpfc_hba_init_link_fc_topology()
746 phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO; in lpfc_hba_init_link_fc_topology()
748 lpfc_init_link(phba, pmb, fc_topology, phba->cfg_link_speed); in lpfc_hba_init_link_fc_topology()
749 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_hba_init_link_fc_topology()
750 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_hba_init_link_fc_topology()
757 mb->mbxCommand, mb->mbxStatus); in lpfc_hba_init_link_fc_topology()
758 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_hba_init_link_fc_topology()
760 writel(0, phba->HCregaddr); in lpfc_hba_init_link_fc_topology()
761 readl(phba->HCregaddr); /* flush */ in lpfc_hba_init_link_fc_topology()
763 writel(0xffffffff, phba->HAregaddr); in lpfc_hba_init_link_fc_topology()
764 readl(phba->HAregaddr); /* flush */ in lpfc_hba_init_link_fc_topology()
766 phba->link_state = LPFC_HBA_ERROR; in lpfc_hba_init_link_fc_topology()
768 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_hba_init_link_fc_topology()
769 return -EIO; in lpfc_hba_init_link_fc_topology()
771 phba->cfg_suppress_link_up = LPFC_INITIALIZE_LINK; in lpfc_hba_init_link_fc_topology()
773 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_hba_init_link_fc_topology()
779 * lpfc_hba_down_link - this routine downs the FC link
781 * @flag: mailbox command issue mode - either MBX_POLL or MBX_NOWAIT
788 * 0 - success
789 * Any other value - error
797 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_hba_down_link()
799 phba->link_state = LPFC_HBA_ERROR; in lpfc_hba_down_link()
800 return -ENOMEM; in lpfc_hba_down_link()
807 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_hba_down_link()
815 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_hba_down_link()
816 return -EIO; in lpfc_hba_down_link()
819 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_hba_down_link()
825 * lpfc_hba_down_prep - Perform lpfc uninitialization prior to HBA reset
832 * 0 - success.
833 * Any other value - error.
841 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_hba_down_prep()
843 writel(0, phba->HCregaddr); in lpfc_hba_down_prep()
844 readl(phba->HCregaddr); /* flush */ in lpfc_hba_down_prep()
847 if (phba->pport->load_flag & FC_UNLOADING) in lpfc_hba_down_prep()
848 lpfc_cleanup_discovery_resources(phba->pport); in lpfc_hba_down_prep()
852 for (i = 0; i <= phba->max_vports && in lpfc_hba_down_prep()
861 * lpfc_sli4_free_sp_events - Cleanup sp_queue_events to free
880 spin_lock_irq(&phba->hbalock); in lpfc_sli4_free_sp_events()
881 phba->hba_flag &= ~HBA_SP_QUEUE_EVT; in lpfc_sli4_free_sp_events()
882 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_free_sp_events()
884 while (!list_empty(&phba->sli4_hba.sp_queue_event)) { in lpfc_sli4_free_sp_events()
886 spin_lock_irq(&phba->hbalock); in lpfc_sli4_free_sp_events()
887 list_remove_head(&phba->sli4_hba.sp_queue_event, in lpfc_sli4_free_sp_events()
889 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_free_sp_events()
891 switch (bf_get(lpfc_wcqe_c_code, &cq_event->cqe.wcqe_cmpl)) { in lpfc_sli4_free_sp_events()
901 lpfc_in_buf_free(phba, &dmabuf->dbuf); in lpfc_sli4_free_sp_events()
907 * lpfc_hba_free_post_buf - Perform lpfc uninitialization after HBA reset
920 struct lpfc_sli *psli = &phba->sli; in lpfc_hba_free_post_buf()
926 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) in lpfc_hba_free_post_buf()
930 pring = &psli->sli3_ring[LPFC_ELS_RING]; in lpfc_hba_free_post_buf()
931 spin_lock_irq(&phba->hbalock); in lpfc_hba_free_post_buf()
932 list_splice_init(&pring->postbufq, &buflist); in lpfc_hba_free_post_buf()
933 spin_unlock_irq(&phba->hbalock); in lpfc_hba_free_post_buf()
937 list_del(&mp->list); in lpfc_hba_free_post_buf()
939 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_hba_free_post_buf()
943 spin_lock_irq(&phba->hbalock); in lpfc_hba_free_post_buf()
944 pring->postbufq_cnt -= count; in lpfc_hba_free_post_buf()
945 spin_unlock_irq(&phba->hbalock); in lpfc_hba_free_post_buf()
950 * lpfc_hba_clean_txcmplq - Perform lpfc uninitialization after HBA reset
962 struct lpfc_sli *psli = &phba->sli; in lpfc_hba_clean_txcmplq()
969 if (phba->sli_rev != LPFC_SLI_REV4) { in lpfc_hba_clean_txcmplq()
970 for (i = 0; i < psli->num_rings; i++) { in lpfc_hba_clean_txcmplq()
971 pring = &psli->sli3_ring[i]; in lpfc_hba_clean_txcmplq()
972 spin_lock_irq(&phba->hbalock); in lpfc_hba_clean_txcmplq()
977 list_splice_init(&pring->txcmplq, &completions); in lpfc_hba_clean_txcmplq()
978 pring->txcmplq_cnt = 0; in lpfc_hba_clean_txcmplq()
979 spin_unlock_irq(&phba->hbalock); in lpfc_hba_clean_txcmplq()
988 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) { in lpfc_hba_clean_txcmplq()
989 pring = qp->pring; in lpfc_hba_clean_txcmplq()
992 spin_lock_irq(&pring->ring_lock); in lpfc_hba_clean_txcmplq()
994 &pring->txcmplq, list) in lpfc_hba_clean_txcmplq()
995 piocb->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ; in lpfc_hba_clean_txcmplq()
996 list_splice_init(&pring->txcmplq, &completions); in lpfc_hba_clean_txcmplq()
997 pring->txcmplq_cnt = 0; in lpfc_hba_clean_txcmplq()
998 spin_unlock_irq(&pring->ring_lock); in lpfc_hba_clean_txcmplq()
1007 * lpfc_hba_down_post_s3 - Perform lpfc uninitialization after HBA reset
1015 * 0 - success.
1016 * Any other value - error.
1027 * lpfc_hba_down_post_s4 - Perform lpfc uninitialization after HBA reset
1034 * 0 - success.
1035 * Any other value - error.
1059 spin_lock_irq(&phba->hbalock); /* required for lpfc_els_sgl_list and */ in lpfc_hba_down_post_s4()
1064 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_hba_down_post_s4()
1066 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) in lpfc_hba_down_post_s4()
1067 sglq_entry->state = SGL_FREED; in lpfc_hba_down_post_s4()
1069 list_splice_init(&phba->sli4_hba.lpfc_abts_els_sgl_list, in lpfc_hba_down_post_s4()
1070 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_hba_down_post_s4()
1073 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_hba_down_post_s4()
1077 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) { in lpfc_hba_down_post_s4()
1078 spin_lock(&phba->sli4_hba.abts_scsi_buf_list_lock); in lpfc_hba_down_post_s4()
1079 list_splice_init(&phba->sli4_hba.lpfc_abts_scsi_buf_list, in lpfc_hba_down_post_s4()
1081 spin_unlock(&phba->sli4_hba.abts_scsi_buf_list_lock); in lpfc_hba_down_post_s4()
1084 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_hba_down_post_s4()
1085 spin_lock(&phba->sli4_hba.abts_nvme_buf_list_lock); in lpfc_hba_down_post_s4()
1086 list_splice_init(&phba->sli4_hba.lpfc_abts_nvme_buf_list, in lpfc_hba_down_post_s4()
1088 list_splice_init(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list, in lpfc_hba_down_post_s4()
1090 spin_unlock(&phba->sli4_hba.abts_nvme_buf_list_lock); in lpfc_hba_down_post_s4()
1093 spin_unlock_irq(&phba->hbalock); in lpfc_hba_down_post_s4()
1096 psb->pCmd = NULL; in lpfc_hba_down_post_s4()
1097 psb->status = IOSTAT_SUCCESS; in lpfc_hba_down_post_s4()
1099 spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag); in lpfc_hba_down_post_s4()
1100 list_splice(&aborts, &phba->lpfc_scsi_buf_list_put); in lpfc_hba_down_post_s4()
1101 spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag); in lpfc_hba_down_post_s4()
1103 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_hba_down_post_s4()
1106 psb->pCmd = NULL; in lpfc_hba_down_post_s4()
1107 psb->status = IOSTAT_SUCCESS; in lpfc_hba_down_post_s4()
1110 spin_lock_irqsave(&phba->nvme_buf_list_put_lock, iflag); in lpfc_hba_down_post_s4()
1111 phba->put_nvme_bufs += cnt; in lpfc_hba_down_post_s4()
1112 list_splice(&nvme_aborts, &phba->lpfc_nvme_buf_list_put); in lpfc_hba_down_post_s4()
1113 spin_unlock_irqrestore(&phba->nvme_buf_list_put_lock, iflag); in lpfc_hba_down_post_s4()
1116 ctxp->flag &= ~(LPFC_NVMET_XBUSY | LPFC_NVMET_ABORT_OP); in lpfc_hba_down_post_s4()
1117 lpfc_nvmet_ctxbuf_post(phba, ctxp->ctxbuf); in lpfc_hba_down_post_s4()
1126 * lpfc_hba_down_post - Wrapper func for hba down post routine
1133 * 0 - success.
1134 * Any other value - error.
1139 return (*phba->lpfc_hba_down_post)(phba); in lpfc_hba_down_post()
1143 * lpfc_hb_timeout - The HBA-timer timeout handler
1146 * This is the HBA-timer timeout handler registered to the lpfc driver. When
1148 * work-port-events bitmap and the worker thread is notified. This timeout
1164 spin_lock_irqsave(&phba->pport->work_port_lock, iflag); in lpfc_hb_timeout()
1165 tmo_posted = phba->pport->work_port_events & WORKER_HB_TMO; in lpfc_hb_timeout()
1167 phba->pport->work_port_events |= WORKER_HB_TMO; in lpfc_hb_timeout()
1168 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag); in lpfc_hb_timeout()
1177 * lpfc_rrq_timeout - The RRQ-timer timeout handler
1180 * This is the RRQ-timer timeout handler registered to the lpfc driver. When
1182 * work-port-events bitmap and the worker thread is notified. This timeout
1195 spin_lock_irqsave(&phba->pport->work_port_lock, iflag); in lpfc_rrq_timeout()
1196 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_rrq_timeout()
1197 phba->hba_flag |= HBA_RRQ_ACTIVE; in lpfc_rrq_timeout()
1199 phba->hba_flag &= ~HBA_RRQ_ACTIVE; in lpfc_rrq_timeout()
1200 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag); in lpfc_rrq_timeout()
1202 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_rrq_timeout()
1207 * lpfc_hb_mbox_cmpl - The lpfc heart-beat mailbox command callback function
1211 * This is the callback function to the lpfc heart-beat mailbox command.
1212 * If configured, the lpfc driver issues the heart-beat mailbox command to
1214 * heart-beat mailbox command is issued, the driver shall set up heart-beat
1216 * heart-beat outstanding state. Once the mailbox command comes back and
1217 * no error conditions detected, the heart-beat mailbox command timer is
1218 * reset to LPFC_HB_MBOX_INTERVAL seconds and the heart-beat outstanding
1219 * state is cleared for the next heart-beat. If the timer expired with the
1220 * heart-beat outstanding state set, the driver will put the HBA offline.
1227 spin_lock_irqsave(&phba->hbalock, drvr_flag); in lpfc_hb_mbox_cmpl()
1228 phba->hb_outstanding = 0; in lpfc_hb_mbox_cmpl()
1229 spin_unlock_irqrestore(&phba->hbalock, drvr_flag); in lpfc_hb_mbox_cmpl()
1231 /* Check and reset heart-beat timer is necessary */ in lpfc_hb_mbox_cmpl()
1232 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_hb_mbox_cmpl()
1233 if (!(phba->pport->fc_flag & FC_OFFLINE_MODE) && in lpfc_hb_mbox_cmpl()
1234 !(phba->link_state == LPFC_HBA_ERROR) && in lpfc_hb_mbox_cmpl()
1235 !(phba->pport->load_flag & FC_UNLOADING)) in lpfc_hb_mbox_cmpl()
1236 mod_timer(&phba->hb_tmofunc, in lpfc_hb_mbox_cmpl()
1243 * lpfc_hb_timeout_handler - The HBA-timer timeout handler
1246 * This is the actual HBA-timer timeout handler to be invoked by the worker
1247 * thread whenever the HBA timer fired and HBA-timeout event posted. This
1250 * or by processing slow-ring or fast-ring events within the HBA-timer
1252 * the timer for the next timeout period. If lpfc heart-beat mailbox command
1253 * is configured and there is no heart-beat mailbox command outstanding, a
1254 * heart-beat mailbox is issued and timer set properly. Otherwise, if there
1255 * has been a heart-beat mailbox command outstanding, the HBA shall be put
1265 struct lpfc_sli *psli = &phba->sli; in lpfc_hb_timeout_handler()
1276 void __iomem *eqdreg = phba->sli4_hba.u.if_type2.EQDregaddr; in lpfc_hb_timeout_handler()
1280 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_hb_timeout_handler()
1286 if ((phba->link_state == LPFC_HBA_ERROR) || in lpfc_hb_timeout_handler()
1287 (phba->pport->load_flag & FC_UNLOADING) || in lpfc_hb_timeout_handler()
1288 (phba->pport->fc_flag & FC_OFFLINE_MODE)) in lpfc_hb_timeout_handler()
1291 if (phba->cfg_auto_imax) { in lpfc_hb_timeout_handler()
1292 if (!phba->last_eqdelay_time) { in lpfc_hb_timeout_handler()
1293 phba->last_eqdelay_time = jiffies; in lpfc_hb_timeout_handler()
1296 time_elapsed = jiffies - phba->last_eqdelay_time; in lpfc_hb_timeout_handler()
1297 phba->last_eqdelay_time = jiffies; in lpfc_hb_timeout_handler()
1301 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_hb_timeout_handler()
1302 if (phba->nvmet_support) { in lpfc_hb_timeout_handler()
1303 tgtp = phba->targetport->private; in lpfc_hb_timeout_handler()
1305 tot = atomic_read(&tgtp->rcv_fcp_cmd_drop); in lpfc_hb_timeout_handler()
1306 tot += atomic_read(&tgtp->xmt_fcp_release); in lpfc_hb_timeout_handler()
1307 tot = atomic_read(&tgtp->rcv_fcp_cmd_in) - tot; in lpfc_hb_timeout_handler()
1309 localport = phba->pport->localport; in lpfc_hb_timeout_handler()
1310 if (!localport || !localport->private) in lpfc_hb_timeout_handler()
1313 localport->private; in lpfc_hb_timeout_handler()
1316 i < phba->cfg_nvme_io_channel; i++) { in lpfc_hb_timeout_handler()
1317 cstat = &lport->cstat[i]; in lpfc_hb_timeout_handler()
1319 &cstat->fc4NvmeInputRequests); in lpfc_hb_timeout_handler()
1321 &cstat->fc4NvmeOutputRequests); in lpfc_hb_timeout_handler()
1323 &cstat->fc4NvmeControlRequests); in lpfc_hb_timeout_handler()
1325 tot -= atomic_read( in lpfc_hb_timeout_handler()
1326 &cstat->fc4NvmeIoCmpls); in lpfc_hb_timeout_handler()
1332 val = phba->cfg_fcp_imax / phba->io_channel_irqs; in lpfc_hb_timeout_handler()
1338 for (i = 0; i < phba->io_channel_irqs; i++) { in lpfc_hb_timeout_handler()
1339 /* Fast-path EQ */ in lpfc_hb_timeout_handler()
1340 qp = phba->sli4_hba.hba_eq[i]; in lpfc_hb_timeout_handler()
1350 qp->EQ_cqe_cnt <= max_cqe) in lpfc_hb_timeout_handler()
1353 val = phba->cfg_fcp_imax; in lpfc_hb_timeout_handler()
1355 if (phba->sli.sli_flag & LPFC_SLI_USE_EQDR) { in lpfc_hb_timeout_handler()
1361 val = phba->cfg_fcp_imax / in lpfc_hb_timeout_handler()
1362 phba->io_channel_irqs; in lpfc_hb_timeout_handler()
1367 if (val != qp->q_mode) { in lpfc_hb_timeout_handler()
1370 &reg_data, qp->queue_id); in lpfc_hb_timeout_handler()
1377 if (val != qp->q_mode) in lpfc_hb_timeout_handler()
1386 qp->q_mode = val; in lpfc_hb_timeout_handler()
1387 qp->EQ_cqe_cnt = 0; in lpfc_hb_timeout_handler()
1392 spin_lock_irq(&phba->pport->work_port_lock); in lpfc_hb_timeout_handler()
1394 if (time_after(phba->last_completion_time + in lpfc_hb_timeout_handler()
1397 spin_unlock_irq(&phba->pport->work_port_lock); in lpfc_hb_timeout_handler()
1398 if (!phba->hb_outstanding) in lpfc_hb_timeout_handler()
1399 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1403 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1408 spin_unlock_irq(&phba->pport->work_port_lock); in lpfc_hb_timeout_handler()
1410 if (phba->elsbuf_cnt && in lpfc_hb_timeout_handler()
1411 (phba->elsbuf_cnt == phba->elsbuf_prev_cnt)) { in lpfc_hb_timeout_handler()
1412 spin_lock_irq(&phba->hbalock); in lpfc_hb_timeout_handler()
1413 list_splice_init(&phba->elsbuf, &completions); in lpfc_hb_timeout_handler()
1414 phba->elsbuf_cnt = 0; in lpfc_hb_timeout_handler()
1415 phba->elsbuf_prev_cnt = 0; in lpfc_hb_timeout_handler()
1416 spin_unlock_irq(&phba->hbalock); in lpfc_hb_timeout_handler()
1421 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_hb_timeout_handler()
1425 phba->elsbuf_prev_cnt = phba->elsbuf_cnt; in lpfc_hb_timeout_handler()
1428 if (phba->cfg_enable_hba_heartbeat) { in lpfc_hb_timeout_handler()
1429 if (!phba->hb_outstanding) { in lpfc_hb_timeout_handler()
1430 if ((!(psli->sli_flag & LPFC_SLI_MBOX_ACTIVE)) && in lpfc_hb_timeout_handler()
1431 (list_empty(&psli->mboxq))) { in lpfc_hb_timeout_handler()
1432 pmboxq = mempool_alloc(phba->mbox_mem_pool, in lpfc_hb_timeout_handler()
1435 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1443 pmboxq->mbox_cmpl = lpfc_hb_mbox_cmpl; in lpfc_hb_timeout_handler()
1444 pmboxq->vport = phba->pport; in lpfc_hb_timeout_handler()
1451 phba->mbox_mem_pool); in lpfc_hb_timeout_handler()
1452 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1458 phba->skipped_hb = 0; in lpfc_hb_timeout_handler()
1459 phba->hb_outstanding = 1; in lpfc_hb_timeout_handler()
1460 } else if (time_before_eq(phba->last_completion_time, in lpfc_hb_timeout_handler()
1461 phba->skipped_hb)) { in lpfc_hb_timeout_handler()
1466 - phba->last_completion_time)); in lpfc_hb_timeout_handler()
1468 phba->skipped_hb = jiffies; in lpfc_hb_timeout_handler()
1470 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1484 - phba->last_completion_time)); in lpfc_hb_timeout_handler()
1485 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1490 mod_timer(&phba->hb_tmofunc, in lpfc_hb_timeout_handler()
1497 * lpfc_offline_eratt - Bring lpfc offline on hardware error attention
1506 struct lpfc_sli *psli = &phba->sli; in lpfc_offline_eratt()
1508 spin_lock_irq(&phba->hbalock); in lpfc_offline_eratt()
1509 psli->sli_flag &= ~LPFC_SLI_ACTIVE; in lpfc_offline_eratt()
1510 spin_unlock_irq(&phba->hbalock); in lpfc_offline_eratt()
1515 spin_lock_irq(&phba->hbalock); in lpfc_offline_eratt()
1517 spin_unlock_irq(&phba->hbalock); in lpfc_offline_eratt()
1521 phba->link_state = LPFC_HBA_ERROR; in lpfc_offline_eratt()
1526 * lpfc_sli4_offline_eratt - Bring lpfc offline on SLI4 hardware error attention
1535 spin_lock_irq(&phba->hbalock); in lpfc_sli4_offline_eratt()
1536 phba->link_state = LPFC_HBA_ERROR; in lpfc_sli4_offline_eratt()
1537 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_offline_eratt()
1546 * lpfc_handle_deferred_eratt - The HBA hardware deferred error handler
1557 uint32_t old_host_status = phba->work_hs; in lpfc_handle_deferred_eratt()
1558 struct lpfc_sli *psli = &phba->sli; in lpfc_handle_deferred_eratt()
1563 if (pci_channel_offline(phba->pcidev)) { in lpfc_handle_deferred_eratt()
1564 spin_lock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1565 phba->hba_flag &= ~DEFER_ERATT; in lpfc_handle_deferred_eratt()
1566 spin_unlock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1573 phba->work_hs, in lpfc_handle_deferred_eratt()
1574 phba->work_status[0], phba->work_status[1]); in lpfc_handle_deferred_eratt()
1576 spin_lock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1577 psli->sli_flag &= ~LPFC_SLI_ACTIVE; in lpfc_handle_deferred_eratt()
1578 spin_unlock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1584 * SCSI layer retry it after re-establishing link. in lpfc_handle_deferred_eratt()
1596 while (phba->work_hs & HS_FFER1) { in lpfc_handle_deferred_eratt()
1598 if (lpfc_readl(phba->HSregaddr, &phba->work_hs)) { in lpfc_handle_deferred_eratt()
1599 phba->work_hs = UNPLUG_ERR ; in lpfc_handle_deferred_eratt()
1603 if (phba->pport->load_flag & FC_UNLOADING) { in lpfc_handle_deferred_eratt()
1604 phba->work_hs = 0; in lpfc_handle_deferred_eratt()
1614 if ((!phba->work_hs) && (!(phba->pport->load_flag & FC_UNLOADING))) in lpfc_handle_deferred_eratt()
1615 phba->work_hs = old_host_status & ~HS_FFER1; in lpfc_handle_deferred_eratt()
1617 spin_lock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1618 phba->hba_flag &= ~DEFER_ERATT; in lpfc_handle_deferred_eratt()
1619 spin_unlock_irq(&phba->hbalock); in lpfc_handle_deferred_eratt()
1620 phba->work_status[0] = readl(phba->MBslimaddr + 0xa8); in lpfc_handle_deferred_eratt()
1621 phba->work_status[1] = readl(phba->MBslimaddr + 0xac); in lpfc_handle_deferred_eratt()
1632 shost = lpfc_shost_from_vport(phba->pport); in lpfc_board_errevt_to_mgmt()
1640 * lpfc_handle_eratt_s3 - The SLI3 HBA hardware error handler
1645 * 1 - HBA error attention interrupt
1646 * 2 - DMA ring index out of range
1647 * 3 - Mailbox command came back as unknown
1652 struct lpfc_vport *vport = phba->pport; in lpfc_handle_eratt_s3()
1653 struct lpfc_sli *psli = &phba->sli; in lpfc_handle_eratt_s3()
1662 if (pci_channel_offline(phba->pcidev)) { in lpfc_handle_eratt_s3()
1663 spin_lock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1664 phba->hba_flag &= ~DEFER_ERATT; in lpfc_handle_eratt_s3()
1665 spin_unlock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1670 if (!phba->cfg_enable_hba_reset) in lpfc_handle_eratt_s3()
1676 if (phba->hba_flag & DEFER_ERATT) in lpfc_handle_eratt_s3()
1679 if ((phba->work_hs & HS_FFER6) || (phba->work_hs & HS_FFER8)) { in lpfc_handle_eratt_s3()
1680 if (phba->work_hs & HS_FFER6) in lpfc_handle_eratt_s3()
1681 /* Re-establishing Link */ in lpfc_handle_eratt_s3()
1683 "1301 Re-establishing Link " in lpfc_handle_eratt_s3()
1685 phba->work_hs, phba->work_status[0], in lpfc_handle_eratt_s3()
1686 phba->work_status[1]); in lpfc_handle_eratt_s3()
1687 if (phba->work_hs & HS_FFER8) in lpfc_handle_eratt_s3()
1692 phba->work_hs, phba->work_status[0], in lpfc_handle_eratt_s3()
1693 phba->work_status[1]); in lpfc_handle_eratt_s3()
1695 spin_lock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1696 psli->sli_flag &= ~LPFC_SLI_ACTIVE; in lpfc_handle_eratt_s3()
1697 spin_unlock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1703 * retry it after re-establishing link. in lpfc_handle_eratt_s3()
1719 } else if (phba->work_hs & HS_CRIT_TEMP) { in lpfc_handle_eratt_s3()
1720 temperature = readl(phba->MBslimaddr + TEMPERATURE_OFFSET); in lpfc_handle_eratt_s3()
1729 temperature, phba->work_hs, in lpfc_handle_eratt_s3()
1730 phba->work_status[0], phba->work_status[1]); in lpfc_handle_eratt_s3()
1732 shost = lpfc_shost_from_vport(phba->pport); in lpfc_handle_eratt_s3()
1739 spin_lock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1740 phba->over_temp_state = HBA_OVER_TEMP; in lpfc_handle_eratt_s3()
1741 spin_unlock_irq(&phba->hbalock); in lpfc_handle_eratt_s3()
1752 phba->work_hs, in lpfc_handle_eratt_s3()
1753 phba->work_status[0], phba->work_status[1]); in lpfc_handle_eratt_s3()
1767 * lpfc_sli4_port_sta_fn_reset - The SLI4 function reset due to port status reg
1784 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_sli4_port_sta_fn_reset()
1811 intr_mode = lpfc_sli4_enable_intr(phba, phba->intr_mode); in lpfc_sli4_port_sta_fn_reset()
1815 return -EIO; in lpfc_sli4_port_sta_fn_reset()
1817 phba->intr_mode = intr_mode; in lpfc_sli4_port_sta_fn_reset()
1826 * lpfc_handle_eratt_s4 - The SLI4 HBA hardware error handler
1835 struct lpfc_vport *vport = phba->pport; in lpfc_handle_eratt_s4()
1851 if (pci_channel_offline(phba->pcidev)) in lpfc_handle_eratt_s4()
1855 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_handle_eratt_s4()
1859 phba->sli4_hba.u.if_type0.UERRLOregaddr, in lpfc_handle_eratt_s4()
1862 phba->sli4_hba.u.if_type0.UEMASKLOregaddr, in lpfc_handle_eratt_s4()
1865 if (pci_rd_rc1 == -EIO && pci_rd_rc2 == -EIO) in lpfc_handle_eratt_s4()
1867 if (!(phba->hba_flag & HBA_RECOVERABLE_UE)) { in lpfc_handle_eratt_s4()
1874 for (i = 0; i < phba->sli4_hba.ue_to_sr / 1000; i++) { in lpfc_handle_eratt_s4()
1875 if (lpfc_readl(phba->sli4_hba.PSMPHRregaddr, in lpfc_handle_eratt_s4()
1897 if (!lpfc_readl(phba->sli4_hba.PSMPHRregaddr, in lpfc_handle_eratt_s4()
1922 phba->sli4_hba.u.if_type2.STATUSregaddr, in lpfc_handle_eratt_s4()
1925 if (pci_rd_rc1 == -EIO) { in lpfc_handle_eratt_s4()
1928 readl(phba->sli4_hba.u.if_type2.STATUSregaddr)); in lpfc_handle_eratt_s4()
1931 reg_err1 = readl(phba->sli4_hba.u.if_type2.ERR1regaddr); in lpfc_handle_eratt_s4()
1932 reg_err2 = readl(phba->sli4_hba.u.if_type2.ERR2regaddr); in lpfc_handle_eratt_s4()
1939 phba->sfp_alarm |= LPFC_TRANSGRESSION_HIGH_TEMPERATURE; in lpfc_handle_eratt_s4()
1944 shost = lpfc_shost_from_vport(phba->pport); in lpfc_handle_eratt_s4()
1951 spin_lock_irq(&phba->hbalock); in lpfc_handle_eratt_s4()
1952 phba->over_temp_state = HBA_OVER_TEMP; in lpfc_handle_eratt_s4()
1953 spin_unlock_irq(&phba->hbalock); in lpfc_handle_eratt_s4()
1973 if (!phba->cfg_enable_hba_reset) in lpfc_handle_eratt_s4()
2010 * lpfc_handle_eratt - Wrapper func for handling hba error attention
2017 * 0 - success.
2018 * Any other value - error.
2023 (*phba->lpfc_handle_eratt)(phba); in lpfc_handle_eratt()
2027 * lpfc_handle_latt - The HBA link event handler
2036 struct lpfc_vport *vport = phba->pport; in lpfc_handle_latt()
2037 struct lpfc_sli *psli = &phba->sli; in lpfc_handle_latt()
2043 pmb = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_handle_latt()
2055 mp->virt = lpfc_mbuf_alloc(phba, 0, &mp->phys); in lpfc_handle_latt()
2056 if (!mp->virt) { in lpfc_handle_latt()
2064 psli->slistat.link_event++; in lpfc_handle_latt()
2066 pmb->mbox_cmpl = lpfc_mbx_cmpl_read_topology; in lpfc_handle_latt()
2067 pmb->vport = vport; in lpfc_handle_latt()
2069 phba->sli.sli3_ring[LPFC_ELS_RING].flag |= LPFC_STOP_IOCB_EVENT; in lpfc_handle_latt()
2077 spin_lock_irq(&phba->hbalock); in lpfc_handle_latt()
2078 writel(HA_LATT, phba->HAregaddr); in lpfc_handle_latt()
2079 readl(phba->HAregaddr); /* flush */ in lpfc_handle_latt()
2080 spin_unlock_irq(&phba->hbalock); in lpfc_handle_latt()
2085 phba->sli.sli3_ring[LPFC_ELS_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_handle_latt()
2086 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_handle_latt()
2090 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_handle_latt()
2093 spin_lock_irq(&phba->hbalock); in lpfc_handle_latt()
2094 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_handle_latt()
2095 control = readl(phba->HCregaddr); in lpfc_handle_latt()
2097 writel(control, phba->HCregaddr); in lpfc_handle_latt()
2098 readl(phba->HCregaddr); /* flush */ in lpfc_handle_latt()
2101 writel(HA_LATT, phba->HAregaddr); in lpfc_handle_latt()
2102 readl(phba->HAregaddr); /* flush */ in lpfc_handle_latt()
2103 spin_unlock_irq(&phba->hbalock); in lpfc_handle_latt()
2105 phba->link_state = LPFC_HBA_ERROR; in lpfc_handle_latt()
2114 * lpfc_parse_vpd - Parse VPD (Vital Product Data)
2124 * 0 - pointer to the VPD passed in is NULL
2125 * 1 - success
2144 while (!finished && (index < (len - 4))) { in lpfc_parse_vpd()
2163 if (Length > len - index) in lpfc_parse_vpd()
2164 Length = len - index; in lpfc_parse_vpd()
2172 Length -= (3+i); in lpfc_parse_vpd()
2173 while(i--) { in lpfc_parse_vpd()
2174 phba->SerialNumber[j++] = vpd[index++]; in lpfc_parse_vpd()
2178 phba->SerialNumber[j] = 0; in lpfc_parse_vpd()
2182 phba->vpd_flag |= VPD_MODEL_DESC; in lpfc_parse_vpd()
2187 Length -= (3+i); in lpfc_parse_vpd()
2188 while(i--) { in lpfc_parse_vpd()
2189 phba->ModelDesc[j++] = vpd[index++]; in lpfc_parse_vpd()
2193 phba->ModelDesc[j] = 0; in lpfc_parse_vpd()
2197 phba->vpd_flag |= VPD_MODEL_NAME; in lpfc_parse_vpd()
2202 Length -= (3+i); in lpfc_parse_vpd()
2203 while(i--) { in lpfc_parse_vpd()
2204 phba->ModelName[j++] = vpd[index++]; in lpfc_parse_vpd()
2208 phba->ModelName[j] = 0; in lpfc_parse_vpd()
2212 phba->vpd_flag |= VPD_PROGRAM_TYPE; in lpfc_parse_vpd()
2217 Length -= (3+i); in lpfc_parse_vpd()
2218 while(i--) { in lpfc_parse_vpd()
2219 phba->ProgramType[j++] = vpd[index++]; in lpfc_parse_vpd()
2223 phba->ProgramType[j] = 0; in lpfc_parse_vpd()
2227 phba->vpd_flag |= VPD_PORT; in lpfc_parse_vpd()
2232 Length -= (3+i); in lpfc_parse_vpd()
2233 while(i--) { in lpfc_parse_vpd()
2234 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_parse_vpd()
2235 (phba->sli4_hba.pport_name_sta == in lpfc_parse_vpd()
2240 phba->Port[j++] = vpd[index++]; in lpfc_parse_vpd()
2244 if ((phba->sli_rev != LPFC_SLI_REV4) || in lpfc_parse_vpd()
2245 (phba->sli4_hba.pport_name_sta == in lpfc_parse_vpd()
2247 phba->Port[j] = 0; in lpfc_parse_vpd()
2255 Length -= (3 + i); in lpfc_parse_vpd()
2273 * lpfc_get_hba_model_desc - Retrieve HBA device model name and description
2288 uint16_t dev_id = phba->pcidev->device; in lpfc_get_hba_model_desc()
2302 if (phba->lmt & LMT_64Gb) in lpfc_get_hba_model_desc()
2304 else if (phba->lmt & LMT_32Gb) in lpfc_get_hba_model_desc()
2306 else if (phba->lmt & LMT_16Gb) in lpfc_get_hba_model_desc()
2308 else if (phba->lmt & LMT_10Gb) in lpfc_get_hba_model_desc()
2310 else if (phba->lmt & LMT_8Gb) in lpfc_get_hba_model_desc()
2312 else if (phba->lmt & LMT_4Gb) in lpfc_get_hba_model_desc()
2314 else if (phba->lmt & LMT_2Gb) in lpfc_get_hba_model_desc()
2316 else if (phba->lmt & LMT_1Gb) in lpfc_get_hba_model_desc()
2321 vp = &phba->vpd; in lpfc_get_hba_model_desc()
2329 if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) in lpfc_get_hba_model_desc()
2340 if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) in lpfc_get_hba_model_desc()
2351 m = (typeof(m)){"LP9802", "PCI-X", in lpfc_get_hba_model_desc()
2355 m = (typeof(m)){"LP10000", "PCI-X", in lpfc_get_hba_model_desc()
2359 m = (typeof(m)){"LPX1000", "PCI-X", in lpfc_get_hba_model_desc()
2363 m = (typeof(m)){"LP982", "PCI-X", in lpfc_get_hba_model_desc()
2367 m = (typeof(m)){"LP1050", "PCI-X", in lpfc_get_hba_model_desc()
2371 m = (typeof(m)){"LP11000", "PCI-X2", in lpfc_get_hba_model_desc()
2375 m = (typeof(m)){"LP11000-SP", "PCI-X2", in lpfc_get_hba_model_desc()
2379 m = (typeof(m)){"LP11002-SP", "PCI-X2", in lpfc_get_hba_model_desc()
2387 m = (typeof(m)){"LPe1000-SP", "PCIe", in lpfc_get_hba_model_desc()
2391 m = (typeof(m)){"LPe1002-SP", "PCIe", in lpfc_get_hba_model_desc()
2395 m = (typeof(m)){"LP1150", "PCI-X2", "Fibre Channel Adapter"}; in lpfc_get_hba_model_desc()
2398 m = (typeof(m)){"LP111", "PCI-X2", in lpfc_get_hba_model_desc()
2418 m = (typeof(m)){"LP101", "PCI-X", in lpfc_get_hba_model_desc()
2422 m = (typeof(m)){"LP10000-S", "PCI", in lpfc_get_hba_model_desc()
2426 m = (typeof(m)){"LP11000-S", "PCI-X2", in lpfc_get_hba_model_desc()
2430 m = (typeof(m)){"LPe11000-S", "PCIe", in lpfc_get_hba_model_desc()
2443 m = (typeof(m)){"LPe12002-SP", "PCIe", "Fibre Channel Adapter"}; in lpfc_get_hba_model_desc()
2446 m = (typeof(m)){"LPe12000-SP", "PCIe", "Fibre Channel Adapter"}; in lpfc_get_hba_model_desc()
2449 m = (typeof(m)){"LPe12000-S", "PCIe", "Fibre Channel Adapter"}; in lpfc_get_hba_model_desc()
2465 m = (typeof(m)){"LPemv12002-S", "PCIe IOV", in lpfc_get_hba_model_desc()
2477 m = (typeof(m)){"LPSe12002-ML1-E", "PCIe", in lpfc_get_hba_model_desc()
2527 phba->Port); in lpfc_get_hba_model_desc()
2541 * lpfc_post_buffer - Post IOCB(s) with DMA buffer descriptor(s) to a IOCB ring
2559 cnt += pring->missbufcnt; in lpfc_post_buffer()
2566 pring->missbufcnt = cnt; in lpfc_post_buffer()
2569 icmd = &iocb->iocb; in lpfc_post_buffer()
2575 mp1->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &mp1->phys); in lpfc_post_buffer()
2576 if (!mp1 || !mp1->virt) { in lpfc_post_buffer()
2579 pring->missbufcnt = cnt; in lpfc_post_buffer()
2583 INIT_LIST_HEAD(&mp1->list); in lpfc_post_buffer()
2588 mp2->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_post_buffer()
2589 &mp2->phys); in lpfc_post_buffer()
2590 if (!mp2 || !mp2->virt) { in lpfc_post_buffer()
2592 lpfc_mbuf_free(phba, mp1->virt, mp1->phys); in lpfc_post_buffer()
2595 pring->missbufcnt = cnt; in lpfc_post_buffer()
2599 INIT_LIST_HEAD(&mp2->list); in lpfc_post_buffer()
2604 icmd->un.cont64[0].addrHigh = putPaddrHigh(mp1->phys); in lpfc_post_buffer()
2605 icmd->un.cont64[0].addrLow = putPaddrLow(mp1->phys); in lpfc_post_buffer()
2606 icmd->un.cont64[0].tus.f.bdeSize = FCELSSIZE; in lpfc_post_buffer()
2607 icmd->ulpBdeCount = 1; in lpfc_post_buffer()
2608 cnt--; in lpfc_post_buffer()
2610 icmd->un.cont64[1].addrHigh = putPaddrHigh(mp2->phys); in lpfc_post_buffer()
2611 icmd->un.cont64[1].addrLow = putPaddrLow(mp2->phys); in lpfc_post_buffer()
2612 icmd->un.cont64[1].tus.f.bdeSize = FCELSSIZE; in lpfc_post_buffer()
2613 cnt--; in lpfc_post_buffer()
2614 icmd->ulpBdeCount = 2; in lpfc_post_buffer()
2617 icmd->ulpCommand = CMD_QUE_RING_BUF64_CN; in lpfc_post_buffer()
2618 icmd->ulpLe = 1; in lpfc_post_buffer()
2620 if (lpfc_sli_issue_iocb(phba, pring->ringno, iocb, 0) == in lpfc_post_buffer()
2622 lpfc_mbuf_free(phba, mp1->virt, mp1->phys); in lpfc_post_buffer()
2626 lpfc_mbuf_free(phba, mp2->virt, mp2->phys); in lpfc_post_buffer()
2631 pring->missbufcnt = cnt; in lpfc_post_buffer()
2638 pring->missbufcnt = 0; in lpfc_post_buffer()
2643 * lpfc_post_rcv_buf - Post the initial receive IOCB buffers to ELS ring
2651 * 0 - success (currently always success)
2656 struct lpfc_sli *psli = &phba->sli; in lpfc_post_rcv_buf()
2659 lpfc_post_buffer(phba, &psli->sli3_ring[LPFC_ELS_RING], LPFC_BUF_RING0); in lpfc_post_rcv_buf()
2660 /* Ring 2 - FCP no buffers needed */ in lpfc_post_rcv_buf()
2665 #define S(N,V) (((V)<<(N))|((V)>>(32-(N))))
2668 * lpfc_sha_init - Set up initial array of hash table entries
2685 * lpfc_sha_iterate - Iterate initial hash table with the working hash table
2704 HashWorkingPointer[t - 3] ^ HashWorkingPointer[t - in lpfc_sha_iterate()
2706 HashWorkingPointer[t - 14] ^ HashWorkingPointer[t - 16]); in lpfc_sha_iterate()
2742 * lpfc_challenge_key - Create challenge key based on WWPN of the HBA
2758 * lpfc_hba_init - Perform special handling for LC HBA initialization
2760 * @hbainit: pointer to an array of unsigned 32-bit integers.
2769 uint32_t *pwwnn = (uint32_t *) phba->wwnn; in lpfc_hba_init()
2779 lpfc_challenge_key(phba->RandomData + t, HashWorking + t); in lpfc_hba_init()
2787 * lpfc_cleanup - Performs vport cleanups before deleting a vport
2798 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup()
2802 if (phba->link_state > LPFC_LINK_DOWN) in lpfc_cleanup()
2805 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_cleanup()
2811 spin_lock_irq(&phba->ndlp_lock); in lpfc_cleanup()
2813 spin_unlock_irq(&phba->ndlp_lock); in lpfc_cleanup()
2818 spin_lock_irq(&phba->ndlp_lock); in lpfc_cleanup()
2821 spin_unlock_irq(&phba->ndlp_lock); in lpfc_cleanup()
2826 spin_unlock_irq(&phba->ndlp_lock); in lpfc_cleanup()
2828 if (vport->port_type != LPFC_PHYSICAL_PORT && in lpfc_cleanup()
2829 ndlp->nlp_DID == Fabric_DID) { in lpfc_cleanup()
2838 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) { in lpfc_cleanup()
2843 if (ndlp->nlp_type & NLP_FABRIC) in lpfc_cleanup()
2855 while (!list_empty(&vport->fc_nodes)) { in lpfc_cleanup()
2860 &vport->fc_nodes, nlp_listp) { in lpfc_cleanup()
2861 lpfc_printf_vlog(ndlp->vport, KERN_ERR, in lpfc_cleanup()
2865 ndlp->nlp_DID, (void *)ndlp, in lpfc_cleanup()
2866 ndlp->nlp_usg_map, in lpfc_cleanup()
2867 kref_read(&ndlp->kref)); in lpfc_cleanup()
2879 * lpfc_stop_vport_timers - Stop all the timers associated with a vport
2889 del_timer_sync(&vport->els_tmofunc); in lpfc_stop_vport_timers()
2890 del_timer_sync(&vport->delayed_disc_tmo); in lpfc_stop_vport_timers()
2896 * __lpfc_sli4_stop_fcf_redisc_wait_timer - Stop FCF rediscovery wait timer
2906 phba->fcf.fcf_flag &= ~FCF_REDISC_PEND; in __lpfc_sli4_stop_fcf_redisc_wait_timer()
2909 del_timer(&phba->fcf.redisc_wait); in __lpfc_sli4_stop_fcf_redisc_wait_timer()
2913 * lpfc_sli4_stop_fcf_redisc_wait_timer - Stop FCF rediscovery wait timer
2924 spin_lock_irq(&phba->hbalock); in lpfc_sli4_stop_fcf_redisc_wait_timer()
2925 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND)) { in lpfc_sli4_stop_fcf_redisc_wait_timer()
2927 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_stop_fcf_redisc_wait_timer()
2932 phba->fcf.fcf_flag &= ~(FCF_DEAD_DISC | FCF_ACVL_DISC); in lpfc_sli4_stop_fcf_redisc_wait_timer()
2933 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_stop_fcf_redisc_wait_timer()
2937 * lpfc_stop_hba_timers - Stop all the timers associated with an HBA
2946 lpfc_stop_vport_timers(phba->pport); in lpfc_stop_hba_timers()
2947 del_timer_sync(&phba->sli.mbox_tmo); in lpfc_stop_hba_timers()
2948 del_timer_sync(&phba->fabric_block_timer); in lpfc_stop_hba_timers()
2949 del_timer_sync(&phba->eratt_poll); in lpfc_stop_hba_timers()
2950 del_timer_sync(&phba->hb_tmofunc); in lpfc_stop_hba_timers()
2951 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_stop_hba_timers()
2952 del_timer_sync(&phba->rrq_tmr); in lpfc_stop_hba_timers()
2953 phba->hba_flag &= ~HBA_RRQ_ACTIVE; in lpfc_stop_hba_timers()
2955 phba->hb_outstanding = 0; in lpfc_stop_hba_timers()
2957 switch (phba->pci_dev_grp) { in lpfc_stop_hba_timers()
2960 del_timer_sync(&phba->fcp_poll_timer); in lpfc_stop_hba_timers()
2969 phba->pci_dev_grp); in lpfc_stop_hba_timers()
2976 * lpfc_block_mgmt_io - Mark a HBA's management interface as blocked
2992 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_block_mgmt_io()
2993 phba->sli.sli_flag |= LPFC_BLOCK_MGMT_IO; in lpfc_block_mgmt_io()
2994 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_block_mgmt_io()
2998 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_block_mgmt_io()
2999 if (phba->sli.mbox_active) { in lpfc_block_mgmt_io()
3000 actcmd = phba->sli.mbox_active->u.mb.mbxCommand; in lpfc_block_mgmt_io()
3005 phba->sli.mbox_active) * 1000) + jiffies; in lpfc_block_mgmt_io()
3007 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_block_mgmt_io()
3010 while (phba->sli.mbox_active) { in lpfc_block_mgmt_io()
3016 "- mbox cmd %x still active\n", in lpfc_block_mgmt_io()
3017 phba->sli.sli_flag, actcmd); in lpfc_block_mgmt_io()
3024 * lpfc_sli4_node_prep - Assign RPIs for active nodes.
3039 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_sli4_node_prep()
3046 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_sli4_node_prep()
3047 if (vports[i]->load_flag & FC_UNLOADING) in lpfc_sli4_node_prep()
3051 &vports[i]->fc_nodes, in lpfc_sli4_node_prep()
3057 spin_lock_irqsave(&phba->ndlp_lock, flags); in lpfc_sli4_node_prep()
3059 spin_unlock_irqrestore(&phba->ndlp_lock, flags); in lpfc_sli4_node_prep()
3062 ndlp->nlp_rpi = rpi; in lpfc_sli4_node_prep()
3063 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_sli4_node_prep()
3065 "flg:%x map:%x %p\n", ndlp->nlp_rpi, in lpfc_sli4_node_prep()
3066 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_sli4_node_prep()
3067 ndlp->nlp_usg_map, ndlp); in lpfc_sli4_node_prep()
3074 * lpfc_online - Initialize and bring a HBA online
3082 * 0 - successful
3083 * 1 - failed
3095 vport = phba->pport; in lpfc_online()
3097 if (!(vport->fc_flag & FC_OFFLINE_MODE)) in lpfc_online()
3105 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_online()
3110 spin_lock_irq(&phba->hbalock); in lpfc_online()
3111 if (!phba->sli4_hba.max_cfg_param.vpi_used) in lpfc_online()
3113 spin_unlock_irq(&phba->hbalock); in lpfc_online()
3118 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME && in lpfc_online()
3119 !phba->nvmet_support) { in lpfc_online()
3120 error = lpfc_nvme_create_localport(phba->pport); in lpfc_online()
3136 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_online()
3139 spin_lock_irq(shost->host_lock); in lpfc_online()
3140 vports[i]->fc_flag &= ~FC_OFFLINE_MODE; in lpfc_online()
3141 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_online()
3142 vports[i]->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_online()
3143 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_online()
3144 vports[i]->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_online()
3146 (vports[i]->port_type != in lpfc_online()
3148 vports[i]->vpi = 0; in lpfc_online()
3150 spin_unlock_irq(shost->host_lock); in lpfc_online()
3160 * lpfc_unblock_mgmt_io - Mark a HBA's management interface to be not blocked
3175 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_unblock_mgmt_io()
3176 phba->sli.sli_flag &= ~LPFC_BLOCK_MGMT_IO; in lpfc_unblock_mgmt_io()
3177 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_unblock_mgmt_io()
3181 * lpfc_offline_prep - Prepare a HBA to be brought offline
3191 struct lpfc_vport *vport = phba->pport; in lpfc_offline_prep()
3197 if (vport->fc_flag & FC_OFFLINE_MODE) in lpfc_offline_prep()
3207 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_offline_prep()
3208 if (vports[i]->load_flag & FC_UNLOADING) in lpfc_offline_prep()
3211 spin_lock_irq(shost->host_lock); in lpfc_offline_prep()
3212 vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_offline_prep()
3213 vports[i]->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_offline_prep()
3214 vports[i]->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_offline_prep()
3215 spin_unlock_irq(shost->host_lock); in lpfc_offline_prep()
3219 &vports[i]->fc_nodes, in lpfc_offline_prep()
3223 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_offline_prep()
3225 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_offline_prep()
3231 spin_lock_irq(shost->host_lock); in lpfc_offline_prep()
3232 ndlp->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_offline_prep()
3233 spin_unlock_irq(shost->host_lock); in lpfc_offline_prep()
3239 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_offline_prep()
3240 lpfc_printf_vlog(ndlp->vport, in lpfc_offline_prep()
3245 ndlp, ndlp->nlp_DID, in lpfc_offline_prep()
3246 ndlp->nlp_usg_map, in lpfc_offline_prep()
3247 ndlp->nlp_rpi); in lpfc_offline_prep()
3249 lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); in lpfc_offline_prep()
3259 if (phba->wq) in lpfc_offline_prep()
3260 flush_workqueue(phba->wq); in lpfc_offline_prep()
3264 * lpfc_offline - Bring a HBA offline
3278 if (phba->pport->fc_flag & FC_OFFLINE_MODE) in lpfc_offline()
3288 lpfc_nvme_destroy_localport(phba->pport); in lpfc_offline()
3292 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) in lpfc_offline()
3300 spin_lock_irq(&phba->hbalock); in lpfc_offline()
3301 phba->work_ha = 0; in lpfc_offline()
3302 spin_unlock_irq(&phba->hbalock); in lpfc_offline()
3305 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_offline()
3307 spin_lock_irq(shost->host_lock); in lpfc_offline()
3308 vports[i]->work_port_events = 0; in lpfc_offline()
3309 vports[i]->fc_flag |= FC_OFFLINE_MODE; in lpfc_offline()
3310 spin_unlock_irq(shost->host_lock); in lpfc_offline()
3316 * lpfc_scsi_free - Free all the SCSI buffers and IOCBs from driver lists
3328 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP)) in lpfc_scsi_free()
3331 spin_lock_irq(&phba->hbalock); in lpfc_scsi_free()
3335 spin_lock(&phba->scsi_buf_list_put_lock); in lpfc_scsi_free()
3336 list_for_each_entry_safe(sb, sb_next, &phba->lpfc_scsi_buf_list_put, in lpfc_scsi_free()
3338 list_del(&sb->list); in lpfc_scsi_free()
3339 dma_pool_free(phba->lpfc_sg_dma_buf_pool, sb->data, in lpfc_scsi_free()
3340 sb->dma_handle); in lpfc_scsi_free()
3342 phba->total_scsi_bufs--; in lpfc_scsi_free()
3344 spin_unlock(&phba->scsi_buf_list_put_lock); in lpfc_scsi_free()
3346 spin_lock(&phba->scsi_buf_list_get_lock); in lpfc_scsi_free()
3347 list_for_each_entry_safe(sb, sb_next, &phba->lpfc_scsi_buf_list_get, in lpfc_scsi_free()
3349 list_del(&sb->list); in lpfc_scsi_free()
3350 dma_pool_free(phba->lpfc_sg_dma_buf_pool, sb->data, in lpfc_scsi_free()
3351 sb->dma_handle); in lpfc_scsi_free()
3353 phba->total_scsi_bufs--; in lpfc_scsi_free()
3355 spin_unlock(&phba->scsi_buf_list_get_lock); in lpfc_scsi_free()
3356 spin_unlock_irq(&phba->hbalock); in lpfc_scsi_free()
3359 * lpfc_nvme_free - Free all the NVME buffers and IOCBs from driver lists
3371 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME)) in lpfc_nvme_free()
3374 spin_lock_irq(&phba->hbalock); in lpfc_nvme_free()
3377 spin_lock(&phba->nvme_buf_list_put_lock); in lpfc_nvme_free()
3379 &phba->lpfc_nvme_buf_list_put, list) { in lpfc_nvme_free()
3380 list_del(&lpfc_ncmd->list); in lpfc_nvme_free()
3381 phba->put_nvme_bufs--; in lpfc_nvme_free()
3382 dma_pool_free(phba->lpfc_sg_dma_buf_pool, lpfc_ncmd->data, in lpfc_nvme_free()
3383 lpfc_ncmd->dma_handle); in lpfc_nvme_free()
3385 phba->total_nvme_bufs--; in lpfc_nvme_free()
3387 spin_unlock(&phba->nvme_buf_list_put_lock); in lpfc_nvme_free()
3389 spin_lock(&phba->nvme_buf_list_get_lock); in lpfc_nvme_free()
3391 &phba->lpfc_nvme_buf_list_get, list) { in lpfc_nvme_free()
3392 list_del(&lpfc_ncmd->list); in lpfc_nvme_free()
3393 phba->get_nvme_bufs--; in lpfc_nvme_free()
3394 dma_pool_free(phba->lpfc_sg_dma_buf_pool, lpfc_ncmd->data, in lpfc_nvme_free()
3395 lpfc_ncmd->dma_handle); in lpfc_nvme_free()
3397 phba->total_nvme_bufs--; in lpfc_nvme_free()
3399 spin_unlock(&phba->nvme_buf_list_get_lock); in lpfc_nvme_free()
3400 spin_unlock_irq(&phba->hbalock); in lpfc_nvme_free()
3403 * lpfc_sli4_els_sgl_update - update ELS xri-sgl sizing and mapping
3412 * 0 - successful (for now, it always returns 0)
3423 * update on pci function's els xri-sgl list in lpfc_sli4_els_sgl_update()
3427 if (els_xri_cnt > phba->sli4_hba.els_xri_cnt) { in lpfc_sli4_els_sgl_update()
3428 /* els xri-sgl expanded */ in lpfc_sli4_els_sgl_update()
3429 xri_cnt = els_xri_cnt - phba->sli4_hba.els_xri_cnt; in lpfc_sli4_els_sgl_update()
3431 "3157 ELS xri-sgl count increased from " in lpfc_sli4_els_sgl_update()
3432 "%d to %d\n", phba->sli4_hba.els_xri_cnt, in lpfc_sli4_els_sgl_update()
3442 rc = -ENOMEM; in lpfc_sli4_els_sgl_update()
3445 sglq_entry->buff_type = GEN_BUFF_TYPE; in lpfc_sli4_els_sgl_update()
3446 sglq_entry->virt = lpfc_mbuf_alloc(phba, 0, in lpfc_sli4_els_sgl_update()
3447 &sglq_entry->phys); in lpfc_sli4_els_sgl_update()
3448 if (sglq_entry->virt == NULL) { in lpfc_sli4_els_sgl_update()
3453 rc = -ENOMEM; in lpfc_sli4_els_sgl_update()
3456 sglq_entry->sgl = sglq_entry->virt; in lpfc_sli4_els_sgl_update()
3457 memset(sglq_entry->sgl, 0, LPFC_BPL_SIZE); in lpfc_sli4_els_sgl_update()
3458 sglq_entry->state = SGL_FREED; in lpfc_sli4_els_sgl_update()
3459 list_add_tail(&sglq_entry->list, &els_sgl_list); in lpfc_sli4_els_sgl_update()
3461 spin_lock_irq(&phba->hbalock); in lpfc_sli4_els_sgl_update()
3462 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_els_sgl_update()
3464 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_sgl_update()
3465 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_els_sgl_update()
3466 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_els_sgl_update()
3467 } else if (els_xri_cnt < phba->sli4_hba.els_xri_cnt) { in lpfc_sli4_els_sgl_update()
3468 /* els xri-sgl shrinked */ in lpfc_sli4_els_sgl_update()
3469 xri_cnt = phba->sli4_hba.els_xri_cnt - els_xri_cnt; in lpfc_sli4_els_sgl_update()
3471 "3158 ELS xri-sgl count decreased from " in lpfc_sli4_els_sgl_update()
3472 "%d to %d\n", phba->sli4_hba.els_xri_cnt, in lpfc_sli4_els_sgl_update()
3474 spin_lock_irq(&phba->hbalock); in lpfc_sli4_els_sgl_update()
3475 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_els_sgl_update()
3476 list_splice_init(&phba->sli4_hba.lpfc_els_sgl_list, in lpfc_sli4_els_sgl_update()
3483 __lpfc_mbuf_free(phba, sglq_entry->virt, in lpfc_sli4_els_sgl_update()
3484 sglq_entry->phys); in lpfc_sli4_els_sgl_update()
3489 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_sgl_update()
3490 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_els_sgl_update()
3491 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_els_sgl_update()
3494 "3163 ELS xri-sgl count unchanged: %d\n", in lpfc_sli4_els_sgl_update()
3496 phba->sli4_hba.els_xri_cnt = els_xri_cnt; in lpfc_sli4_els_sgl_update()
3502 &phba->sli4_hba.lpfc_els_sgl_list, list) { in lpfc_sli4_els_sgl_update()
3508 rc = -ENOMEM; in lpfc_sli4_els_sgl_update()
3511 sglq_entry->sli4_lxritag = lxri; in lpfc_sli4_els_sgl_update()
3512 sglq_entry->sli4_xritag = phba->sli4_hba.xri_ids[lxri]; in lpfc_sli4_els_sgl_update()
3522 * lpfc_sli4_nvmet_sgl_update - update xri-sgl sizing and mapping
3531 * 0 - successful (for now, it always returns 0)
3543 * update on pci function's nvmet xri-sgl list in lpfc_sli4_nvmet_sgl_update()
3548 nvmet_xri_cnt = phba->sli4_hba.max_cfg_param.max_xri - els_xri_cnt; in lpfc_sli4_nvmet_sgl_update()
3549 if (nvmet_xri_cnt > phba->sli4_hba.nvmet_xri_cnt) { in lpfc_sli4_nvmet_sgl_update()
3550 /* els xri-sgl expanded */ in lpfc_sli4_nvmet_sgl_update()
3551 xri_cnt = nvmet_xri_cnt - phba->sli4_hba.nvmet_xri_cnt; in lpfc_sli4_nvmet_sgl_update()
3553 "6302 NVMET xri-sgl cnt grew from %d to %d\n", in lpfc_sli4_nvmet_sgl_update()
3554 phba->sli4_hba.nvmet_xri_cnt, nvmet_xri_cnt); in lpfc_sli4_nvmet_sgl_update()
3563 rc = -ENOMEM; in lpfc_sli4_nvmet_sgl_update()
3566 sglq_entry->buff_type = NVMET_BUFF_TYPE; in lpfc_sli4_nvmet_sgl_update()
3567 sglq_entry->virt = lpfc_nvmet_buf_alloc(phba, 0, in lpfc_sli4_nvmet_sgl_update()
3568 &sglq_entry->phys); in lpfc_sli4_nvmet_sgl_update()
3569 if (sglq_entry->virt == NULL) { in lpfc_sli4_nvmet_sgl_update()
3574 rc = -ENOMEM; in lpfc_sli4_nvmet_sgl_update()
3577 sglq_entry->sgl = sglq_entry->virt; in lpfc_sli4_nvmet_sgl_update()
3578 memset(sglq_entry->sgl, 0, in lpfc_sli4_nvmet_sgl_update()
3579 phba->cfg_sg_dma_buf_size); in lpfc_sli4_nvmet_sgl_update()
3580 sglq_entry->state = SGL_FREED; in lpfc_sli4_nvmet_sgl_update()
3581 list_add_tail(&sglq_entry->list, &nvmet_sgl_list); in lpfc_sli4_nvmet_sgl_update()
3583 spin_lock_irq(&phba->hbalock); in lpfc_sli4_nvmet_sgl_update()
3584 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_nvmet_sgl_update()
3586 &phba->sli4_hba.lpfc_nvmet_sgl_list); in lpfc_sli4_nvmet_sgl_update()
3587 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_nvmet_sgl_update()
3588 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_nvmet_sgl_update()
3589 } else if (nvmet_xri_cnt < phba->sli4_hba.nvmet_xri_cnt) { in lpfc_sli4_nvmet_sgl_update()
3590 /* nvmet xri-sgl shrunk */ in lpfc_sli4_nvmet_sgl_update()
3591 xri_cnt = phba->sli4_hba.nvmet_xri_cnt - nvmet_xri_cnt; in lpfc_sli4_nvmet_sgl_update()
3593 "6305 NVMET xri-sgl count decreased from " in lpfc_sli4_nvmet_sgl_update()
3594 "%d to %d\n", phba->sli4_hba.nvmet_xri_cnt, in lpfc_sli4_nvmet_sgl_update()
3596 spin_lock_irq(&phba->hbalock); in lpfc_sli4_nvmet_sgl_update()
3597 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_nvmet_sgl_update()
3598 list_splice_init(&phba->sli4_hba.lpfc_nvmet_sgl_list, in lpfc_sli4_nvmet_sgl_update()
3605 lpfc_nvmet_buf_free(phba, sglq_entry->virt, in lpfc_sli4_nvmet_sgl_update()
3606 sglq_entry->phys); in lpfc_sli4_nvmet_sgl_update()
3611 &phba->sli4_hba.lpfc_nvmet_sgl_list); in lpfc_sli4_nvmet_sgl_update()
3612 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_nvmet_sgl_update()
3613 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_nvmet_sgl_update()
3616 "6306 NVMET xri-sgl count unchanged: %d\n", in lpfc_sli4_nvmet_sgl_update()
3618 phba->sli4_hba.nvmet_xri_cnt = nvmet_xri_cnt; in lpfc_sli4_nvmet_sgl_update()
3624 &phba->sli4_hba.lpfc_nvmet_sgl_list, list) { in lpfc_sli4_nvmet_sgl_update()
3630 rc = -ENOMEM; in lpfc_sli4_nvmet_sgl_update()
3633 sglq_entry->sli4_lxritag = lxri; in lpfc_sli4_nvmet_sgl_update()
3634 sglq_entry->sli4_xritag = phba->sli4_hba.xri_ids[lxri]; in lpfc_sli4_nvmet_sgl_update()
3644 * lpfc_sli4_scsi_sgl_update - update xri-sgl sizing and mapping
3653 * 0 - successful (for now, it always returns 0)
3664 * update on pci function's els xri-sgl list in lpfc_sli4_scsi_sgl_update()
3667 phba->total_scsi_bufs = 0; in lpfc_sli4_scsi_sgl_update()
3670 * update on pci function's allocated scsi xri-sgl list in lpfc_sli4_scsi_sgl_update()
3673 phba->sli4_hba.scsi_xri_max = phba->sli4_hba.max_cfg_param.max_xri - in lpfc_sli4_scsi_sgl_update()
3676 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP)) in lpfc_sli4_scsi_sgl_update()
3679 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) in lpfc_sli4_scsi_sgl_update()
3680 phba->sli4_hba.scsi_xri_max = /* Split them up */ in lpfc_sli4_scsi_sgl_update()
3681 (phba->sli4_hba.scsi_xri_max * in lpfc_sli4_scsi_sgl_update()
3682 phba->cfg_xri_split) / 100; in lpfc_sli4_scsi_sgl_update()
3684 spin_lock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3685 spin_lock(&phba->scsi_buf_list_put_lock); in lpfc_sli4_scsi_sgl_update()
3686 list_splice_init(&phba->lpfc_scsi_buf_list_get, &scsi_sgl_list); in lpfc_sli4_scsi_sgl_update()
3687 list_splice(&phba->lpfc_scsi_buf_list_put, &scsi_sgl_list); in lpfc_sli4_scsi_sgl_update()
3688 spin_unlock(&phba->scsi_buf_list_put_lock); in lpfc_sli4_scsi_sgl_update()
3689 spin_unlock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3692 "6060 Current allocated SCSI xri-sgl count:%d, " in lpfc_sli4_scsi_sgl_update()
3694 phba->sli4_hba.scsi_xri_cnt, in lpfc_sli4_scsi_sgl_update()
3695 phba->sli4_hba.scsi_xri_max, phba->cfg_xri_split); in lpfc_sli4_scsi_sgl_update()
3697 if (phba->sli4_hba.scsi_xri_cnt > phba->sli4_hba.scsi_xri_max) { in lpfc_sli4_scsi_sgl_update()
3699 scsi_xri_cnt = phba->sli4_hba.scsi_xri_cnt - in lpfc_sli4_scsi_sgl_update()
3700 phba->sli4_hba.scsi_xri_max; in lpfc_sli4_scsi_sgl_update()
3706 dma_pool_free(phba->lpfc_sg_dma_buf_pool, in lpfc_sli4_scsi_sgl_update()
3707 psb->data, psb->dma_handle); in lpfc_sli4_scsi_sgl_update()
3711 spin_lock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3712 phba->sli4_hba.scsi_xri_cnt -= scsi_xri_cnt; in lpfc_sli4_scsi_sgl_update()
3713 spin_unlock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3725 rc = -ENOMEM; in lpfc_sli4_scsi_sgl_update()
3728 psb->cur_iocbq.sli4_lxritag = lxri; in lpfc_sli4_scsi_sgl_update()
3729 psb->cur_iocbq.sli4_xritag = phba->sli4_hba.xri_ids[lxri]; in lpfc_sli4_scsi_sgl_update()
3731 spin_lock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3732 spin_lock(&phba->scsi_buf_list_put_lock); in lpfc_sli4_scsi_sgl_update()
3733 list_splice_init(&scsi_sgl_list, &phba->lpfc_scsi_buf_list_get); in lpfc_sli4_scsi_sgl_update()
3734 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_put); in lpfc_sli4_scsi_sgl_update()
3735 spin_unlock(&phba->scsi_buf_list_put_lock); in lpfc_sli4_scsi_sgl_update()
3736 spin_unlock_irq(&phba->scsi_buf_list_get_lock); in lpfc_sli4_scsi_sgl_update()
3752 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, in lpfc_get_wwpn()
3755 return (uint64_t)-1; in lpfc_get_wwpn()
3764 bf_get(lpfc_mqe_command, &mboxq->u.mqe), in lpfc_get_wwpn()
3765 bf_get(lpfc_mqe_status, &mboxq->u.mqe)); in lpfc_get_wwpn()
3766 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_get_wwpn()
3767 return (uint64_t) -1; in lpfc_get_wwpn()
3769 mb = &mboxq->u.mb; in lpfc_get_wwpn()
3770 memcpy(&wwn, (char *)mb->un.varRDnvp.portname, sizeof(uint64_t)); in lpfc_get_wwpn()
3772 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_get_wwpn()
3773 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_get_wwpn()
3780 * lpfc_sli4_nvme_sgl_update - update xri-sgl sizing and mapping
3789 * 0 - successful (for now, it always returns 0)
3800 phba->total_nvme_bufs = 0; in lpfc_sli4_nvme_sgl_update()
3801 phba->get_nvme_bufs = 0; in lpfc_sli4_nvme_sgl_update()
3802 phba->put_nvme_bufs = 0; in lpfc_sli4_nvme_sgl_update()
3804 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME)) in lpfc_sli4_nvme_sgl_update()
3807 * update on pci function's allocated nvme xri-sgl list in lpfc_sli4_nvme_sgl_update()
3812 nvme_xri_max = phba->sli4_hba.max_cfg_param.max_xri - els_xri_cnt; in lpfc_sli4_nvme_sgl_update()
3813 phba->sli4_hba.nvme_xri_max = nvme_xri_max; in lpfc_sli4_nvme_sgl_update()
3814 phba->sli4_hba.nvme_xri_max -= phba->sli4_hba.scsi_xri_max; in lpfc_sli4_nvme_sgl_update()
3817 "6074 Current allocated NVME xri-sgl count:%d, " in lpfc_sli4_nvme_sgl_update()
3819 phba->sli4_hba.nvme_xri_cnt, in lpfc_sli4_nvme_sgl_update()
3820 phba->sli4_hba.nvme_xri_max); in lpfc_sli4_nvme_sgl_update()
3822 spin_lock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3823 spin_lock(&phba->nvme_buf_list_put_lock); in lpfc_sli4_nvme_sgl_update()
3824 list_splice_init(&phba->lpfc_nvme_buf_list_get, &nvme_sgl_list); in lpfc_sli4_nvme_sgl_update()
3825 list_splice(&phba->lpfc_nvme_buf_list_put, &nvme_sgl_list); in lpfc_sli4_nvme_sgl_update()
3826 cnt = phba->get_nvme_bufs + phba->put_nvme_bufs; in lpfc_sli4_nvme_sgl_update()
3827 phba->get_nvme_bufs = 0; in lpfc_sli4_nvme_sgl_update()
3828 phba->put_nvme_bufs = 0; in lpfc_sli4_nvme_sgl_update()
3829 spin_unlock(&phba->nvme_buf_list_put_lock); in lpfc_sli4_nvme_sgl_update()
3830 spin_unlock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3832 if (phba->sli4_hba.nvme_xri_cnt > phba->sli4_hba.nvme_xri_max) { in lpfc_sli4_nvme_sgl_update()
3834 spin_lock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3835 nvme_xri_cnt = phba->sli4_hba.nvme_xri_cnt - in lpfc_sli4_nvme_sgl_update()
3836 phba->sli4_hba.nvme_xri_max; in lpfc_sli4_nvme_sgl_update()
3837 spin_unlock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3843 dma_pool_free(phba->lpfc_sg_dma_buf_pool, in lpfc_sli4_nvme_sgl_update()
3844 lpfc_ncmd->data, in lpfc_sli4_nvme_sgl_update()
3845 lpfc_ncmd->dma_handle); in lpfc_sli4_nvme_sgl_update()
3849 spin_lock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3850 phba->sli4_hba.nvme_xri_cnt -= nvme_xri_cnt; in lpfc_sli4_nvme_sgl_update()
3851 spin_unlock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3864 rc = -ENOMEM; in lpfc_sli4_nvme_sgl_update()
3867 lpfc_ncmd->cur_iocbq.sli4_lxritag = lxri; in lpfc_sli4_nvme_sgl_update()
3868 lpfc_ncmd->cur_iocbq.sli4_xritag = phba->sli4_hba.xri_ids[lxri]; in lpfc_sli4_nvme_sgl_update()
3870 spin_lock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3871 spin_lock(&phba->nvme_buf_list_put_lock); in lpfc_sli4_nvme_sgl_update()
3872 list_splice_init(&nvme_sgl_list, &phba->lpfc_nvme_buf_list_get); in lpfc_sli4_nvme_sgl_update()
3873 phba->get_nvme_bufs = cnt; in lpfc_sli4_nvme_sgl_update()
3874 INIT_LIST_HEAD(&phba->lpfc_nvme_buf_list_put); in lpfc_sli4_nvme_sgl_update()
3875 spin_unlock(&phba->nvme_buf_list_put_lock); in lpfc_sli4_nvme_sgl_update()
3876 spin_unlock_irq(&phba->nvme_buf_list_get_lock); in lpfc_sli4_nvme_sgl_update()
3885 * lpfc_create_port - Create an FC port
3897 * @vport - pointer to the virtual N_Port data structure.
3898 * NULL - port create failed.
3912 if (phba->sli_rev < LPFC_SLI_REV4 && in lpfc_create_port()
3913 dev == &phba->pcidev->dev) { in lpfc_create_port()
3933 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) { in lpfc_create_port()
3934 if (dev != &phba->pcidev->dev) { in lpfc_create_port()
3945 } else if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_create_port()
3952 vport = (struct lpfc_vport *) shost->hostdata; in lpfc_create_port()
3953 vport->phba = phba; in lpfc_create_port()
3954 vport->load_flag |= FC_LOADING; in lpfc_create_port()
3955 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_create_port()
3956 vport->fc_rscn_flush = 0; in lpfc_create_port()
3959 shost->unique_id = instance; in lpfc_create_port()
3960 shost->max_id = LPFC_MAX_TARGET; in lpfc_create_port()
3961 shost->max_lun = vport->cfg_max_luns; in lpfc_create_port()
3962 shost->this_id = -1; in lpfc_create_port()
3963 shost->max_cmd_len = 16; in lpfc_create_port()
3964 shost->nr_hw_queues = phba->cfg_fcp_io_channel; in lpfc_create_port()
3965 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_create_port()
3966 shost->dma_boundary = in lpfc_create_port()
3967 phba->sli4_hba.pc_sli4_params.sge_supp_len-1; in lpfc_create_port()
3968 shost->sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_create_port()
3976 shost->can_queue = phba->cfg_hba_queue_depth - 10; in lpfc_create_port()
3977 if (dev != &phba->pcidev->dev) { in lpfc_create_port()
3978 shost->transportt = lpfc_vport_transport_template; in lpfc_create_port()
3979 vport->port_type = LPFC_NPIV_PORT; in lpfc_create_port()
3981 shost->transportt = lpfc_transport_template; in lpfc_create_port()
3982 vport->port_type = LPFC_PHYSICAL_PORT; in lpfc_create_port()
3986 INIT_LIST_HEAD(&vport->fc_nodes); in lpfc_create_port()
3987 INIT_LIST_HEAD(&vport->rcv_buffer_list); in lpfc_create_port()
3988 spin_lock_init(&vport->work_port_lock); in lpfc_create_port()
3990 timer_setup(&vport->fc_disctmo, lpfc_disc_timeout, 0); in lpfc_create_port()
3992 timer_setup(&vport->els_tmofunc, lpfc_els_timeout, 0); in lpfc_create_port()
3994 timer_setup(&vport->delayed_disc_tmo, lpfc_delayed_disc_tmo, 0); in lpfc_create_port()
3996 error = scsi_add_host_with_dma(shost, dev, &phba->pcidev->dev); in lpfc_create_port()
4000 spin_lock_irq(&phba->hbalock); in lpfc_create_port()
4001 list_add_tail(&vport->listentry, &phba->port_list); in lpfc_create_port()
4002 spin_unlock_irq(&phba->hbalock); in lpfc_create_port()
4012 * destroy_port - destroy an FC port
4022 struct lpfc_hba *phba = vport->phba; in destroy_port()
4028 spin_lock_irq(&phba->hbalock); in destroy_port()
4029 list_del_init(&vport->listentry); in destroy_port()
4030 spin_unlock_irq(&phba->hbalock); in destroy_port()
4037 * lpfc_get_instance - Get a unique integer ID
4043 * instance - a unique integer ID allocated as the new instance.
4044 * -1 - lpfc get instance failed.
4052 return ret < 0 ? -1 : ret; in lpfc_get_instance()
4056 * lpfc_scan_finished - method for SCSI layer to detect whether scan is done
4067 * 0 - SCSI host scan is not over yet.
4068 * 1 - SCSI host scan is over.
4072 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; in lpfc_scan_finished()
4073 struct lpfc_hba *phba = vport->phba; in lpfc_scan_finished()
4076 spin_lock_irq(shost->host_lock); in lpfc_scan_finished()
4078 if (vport->load_flag & FC_UNLOADING) { in lpfc_scan_finished()
4090 phba->link_state <= LPFC_LINK_DOWN) { in lpfc_scan_finished()
4098 if (vport->port_state != LPFC_VPORT_READY) in lpfc_scan_finished()
4100 if (vport->num_disc_nodes || vport->fc_prli_sent) in lpfc_scan_finished()
4102 if (vport->fc_map_cnt == 0 && time < msecs_to_jiffies(2 * 1000)) in lpfc_scan_finished()
4104 if ((phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE) != 0) in lpfc_scan_finished()
4110 spin_unlock_irq(shost->host_lock); in lpfc_scan_finished()
4115 * lpfc_host_attrib_init - Initialize SCSI host attributes on a FC port
4123 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; in lpfc_host_attrib_init()
4124 struct lpfc_hba *phba = vport->phba; in lpfc_host_attrib_init()
4129 fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn); in lpfc_host_attrib_init()
4130 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn); in lpfc_host_attrib_init()
4142 if (phba->lmt & LMT_64Gb) in lpfc_host_attrib_init()
4144 if (phba->lmt & LMT_32Gb) in lpfc_host_attrib_init()
4146 if (phba->lmt & LMT_16Gb) in lpfc_host_attrib_init()
4148 if (phba->lmt & LMT_10Gb) in lpfc_host_attrib_init()
4150 if (phba->lmt & LMT_8Gb) in lpfc_host_attrib_init()
4152 if (phba->lmt & LMT_4Gb) in lpfc_host_attrib_init()
4154 if (phba->lmt & LMT_2Gb) in lpfc_host_attrib_init()
4156 if (phba->lmt & LMT_1Gb) in lpfc_host_attrib_init()
4160 (((uint32_t) vport->fc_sparam.cmn.bbRcvSizeMsb & 0x0F) << 8) | in lpfc_host_attrib_init()
4161 (uint32_t) vport->fc_sparam.cmn.bbRcvSizeLsb; in lpfc_host_attrib_init()
4163 fc_host_dev_loss_tmo(shost) = vport->cfg_devloss_tmo; in lpfc_host_attrib_init()
4171 fc_host_max_npiv_vports(shost) = phba->max_vpi; in lpfc_host_attrib_init()
4172 spin_lock_irq(shost->host_lock); in lpfc_host_attrib_init()
4173 vport->load_flag &= ~FC_LOADING; in lpfc_host_attrib_init()
4174 spin_unlock_irq(shost->host_lock); in lpfc_host_attrib_init()
4178 * lpfc_stop_port_s3 - Stop SLI3 device port
4189 writel(0, phba->HCregaddr); in lpfc_stop_port_s3()
4190 readl(phba->HCregaddr); /* flush */ in lpfc_stop_port_s3()
4192 writel(0xffffffff, phba->HAregaddr); in lpfc_stop_port_s3()
4193 readl(phba->HAregaddr); /* flush */ in lpfc_stop_port_s3()
4197 phba->pport->work_port_events = 0; in lpfc_stop_port_s3()
4201 * lpfc_stop_port_s4 - Stop SLI4 device port
4213 phba->pport->work_port_events = 0; in lpfc_stop_port_s4()
4214 phba->sli4_hba.intr_enable = 0; in lpfc_stop_port_s4()
4218 * lpfc_stop_port - Wrapper function for stopping hba port
4227 phba->lpfc_stop_port(phba); in lpfc_stop_port()
4229 if (phba->wq) in lpfc_stop_port()
4230 flush_workqueue(phba->wq); in lpfc_stop_port()
4234 * lpfc_fcf_redisc_wait_start_timer - Start fcf rediscover wait timer
4245 mod_timer(&phba->fcf.redisc_wait, fcf_redisc_wait_tmo); in lpfc_fcf_redisc_wait_start_timer()
4246 spin_lock_irq(&phba->hbalock); in lpfc_fcf_redisc_wait_start_timer()
4248 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_fcf_redisc_wait_start_timer()
4250 phba->fcf.fcf_flag |= FCF_REDISC_PEND; in lpfc_fcf_redisc_wait_start_timer()
4251 spin_unlock_irq(&phba->hbalock); in lpfc_fcf_redisc_wait_start_timer()
4255 * lpfc_sli4_fcf_redisc_wait_tmo - FCF table rediscover wait timeout
4270 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_redisc_wait_tmo()
4271 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND)) { in lpfc_sli4_fcf_redisc_wait_tmo()
4272 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_redisc_wait_tmo()
4276 phba->fcf.fcf_flag &= ~FCF_REDISC_PEND; in lpfc_sli4_fcf_redisc_wait_tmo()
4278 phba->fcf.fcf_flag |= FCF_REDISC_EVT; in lpfc_sli4_fcf_redisc_wait_tmo()
4279 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_redisc_wait_tmo()
4287 * lpfc_sli4_parse_latt_fault - Parse sli4 link-attention link fault code
4291 * This routine is to parse the SLI4 link-attention link fault code.
4312 * lpfc_sli4_parse_latt_type - Parse sli4 link attention type
4333 /* Ignore physical link up events - wait for logical link up */ in lpfc_sli4_parse_latt_type()
4350 * lpfc_sli_port_speed_get - Get sli3 link speed code to link speed
4365 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_sli_port_speed_get()
4366 switch (phba->fc_linkspeed) { in lpfc_sli_port_speed_get()
4389 if (phba->sli4_hba.link_state.logical_speed) in lpfc_sli_port_speed_get()
4391 phba->sli4_hba.link_state.logical_speed; in lpfc_sli_port_speed_get()
4393 link_speed = phba->sli4_hba.link_state.speed; in lpfc_sli_port_speed_get()
4399 * lpfc_sli4_port_speed_parse - Parse async evt link speed code to link speed
4486 * lpfc_sli4_async_link_evt - Process the asynchronous FCoE link event
4506 phba->fcoe_eventtag = acqe_link->event_tag; in lpfc_sli4_async_link_evt()
4507 pmb = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_async_link_evt()
4519 mp->virt = lpfc_mbuf_alloc(phba, 0, &mp->phys); in lpfc_sli4_async_link_evt()
4520 if (!mp->virt) { in lpfc_sli4_async_link_evt()
4530 phba->sli4_hba.els_wq->pring->flag |= LPFC_STOP_IOCB_EVENT; in lpfc_sli4_async_link_evt()
4533 phba->sli.slistat.link_event++; in lpfc_sli4_async_link_evt()
4537 pmb->mbox_cmpl = lpfc_mbx_cmpl_read_topology; in lpfc_sli4_async_link_evt()
4538 pmb->vport = phba->pport; in lpfc_sli4_async_link_evt()
4541 phba->sli4_hba.link_state.speed = in lpfc_sli4_async_link_evt()
4544 phba->sli4_hba.link_state.duplex = in lpfc_sli4_async_link_evt()
4546 phba->sli4_hba.link_state.status = in lpfc_sli4_async_link_evt()
4548 phba->sli4_hba.link_state.type = in lpfc_sli4_async_link_evt()
4550 phba->sli4_hba.link_state.number = in lpfc_sli4_async_link_evt()
4552 phba->sli4_hba.link_state.fault = in lpfc_sli4_async_link_evt()
4554 phba->sli4_hba.link_state.logical_speed = in lpfc_sli4_async_link_evt()
4558 "2900 Async FC/FCoE Link event - Speed:%dGBit " in lpfc_sli4_async_link_evt()
4561 phba->sli4_hba.link_state.speed, in lpfc_sli4_async_link_evt()
4562 phba->sli4_hba.link_state.topology, in lpfc_sli4_async_link_evt()
4563 phba->sli4_hba.link_state.status, in lpfc_sli4_async_link_evt()
4564 phba->sli4_hba.link_state.type, in lpfc_sli4_async_link_evt()
4565 phba->sli4_hba.link_state.number, in lpfc_sli4_async_link_evt()
4566 phba->sli4_hba.link_state.logical_speed, in lpfc_sli4_async_link_evt()
4567 phba->sli4_hba.link_state.fault); in lpfc_sli4_async_link_evt()
4570 * topology info. Note: Optional for non FC-AL ports. in lpfc_sli4_async_link_evt()
4572 if (!(phba->hba_flag & HBA_FCOE_MODE)) { in lpfc_sli4_async_link_evt()
4584 mb = &pmb->u.mb; in lpfc_sli4_async_link_evt()
4585 mb->mbxStatus = MBX_SUCCESS; in lpfc_sli4_async_link_evt()
4591 la = (struct lpfc_mbx_read_top *) &pmb->u.mb.un.varReadTop; in lpfc_sli4_async_link_evt()
4592 la->eventTag = acqe_link->event_tag; in lpfc_sli4_async_link_evt()
4613 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_sli4_async_link_evt()
4617 * lpfc_sli4_async_fc_evt - Process the asynchronous FC link event
4642 phba->sli4_hba.link_state.speed = in lpfc_sli4_async_fc_evt()
4645 phba->sli4_hba.link_state.duplex = LPFC_ASYNC_LINK_DUPLEX_FULL; in lpfc_sli4_async_fc_evt()
4646 phba->sli4_hba.link_state.topology = in lpfc_sli4_async_fc_evt()
4648 phba->sli4_hba.link_state.status = in lpfc_sli4_async_fc_evt()
4650 phba->sli4_hba.link_state.type = in lpfc_sli4_async_fc_evt()
4652 phba->sli4_hba.link_state.number = in lpfc_sli4_async_fc_evt()
4654 phba->sli4_hba.link_state.fault = in lpfc_sli4_async_fc_evt()
4656 phba->sli4_hba.link_state.logical_speed = in lpfc_sli4_async_fc_evt()
4659 "2896 Async FC event - Speed:%dGBaud Topology:x%x " in lpfc_sli4_async_fc_evt()
4662 phba->sli4_hba.link_state.speed, in lpfc_sli4_async_fc_evt()
4663 phba->sli4_hba.link_state.topology, in lpfc_sli4_async_fc_evt()
4664 phba->sli4_hba.link_state.status, in lpfc_sli4_async_fc_evt()
4665 phba->sli4_hba.link_state.type, in lpfc_sli4_async_fc_evt()
4666 phba->sli4_hba.link_state.number, in lpfc_sli4_async_fc_evt()
4667 phba->sli4_hba.link_state.logical_speed, in lpfc_sli4_async_fc_evt()
4668 phba->sli4_hba.link_state.fault); in lpfc_sli4_async_fc_evt()
4669 pmb = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_async_fc_evt()
4681 mp->virt = lpfc_mbuf_alloc(phba, 0, &mp->phys); in lpfc_sli4_async_fc_evt()
4682 if (!mp->virt) { in lpfc_sli4_async_fc_evt()
4692 phba->sli4_hba.els_wq->pring->flag |= LPFC_STOP_IOCB_EVENT; in lpfc_sli4_async_fc_evt()
4695 phba->sli.slistat.link_event++; in lpfc_sli4_async_fc_evt()
4699 pmb->mbox_cmpl = lpfc_mbx_cmpl_read_topology; in lpfc_sli4_async_fc_evt()
4700 pmb->vport = phba->pport; in lpfc_sli4_async_fc_evt()
4702 if (phba->sli4_hba.link_state.status != LPFC_FC_LA_TYPE_LINK_UP) { in lpfc_sli4_async_fc_evt()
4703 phba->link_flag &= ~(LS_MDS_LINK_DOWN | LS_MDS_LOOPBACK); in lpfc_sli4_async_fc_evt()
4705 switch (phba->sli4_hba.link_state.status) { in lpfc_sli4_async_fc_evt()
4707 phba->link_flag |= LS_MDS_LINK_DOWN; in lpfc_sli4_async_fc_evt()
4710 phba->link_flag |= LS_MDS_LOOPBACK; in lpfc_sli4_async_fc_evt()
4717 mb = &pmb->u.mb; in lpfc_sli4_async_fc_evt()
4718 mb->mbxStatus = MBX_SUCCESS; in lpfc_sli4_async_fc_evt()
4724 la = (struct lpfc_mbx_read_top *)&pmb->u.mb.un.varReadTop; in lpfc_sli4_async_fc_evt()
4725 la->eventTag = acqe_fc->event_tag; in lpfc_sli4_async_fc_evt()
4727 if (phba->sli4_hba.link_state.status == in lpfc_sli4_async_fc_evt()
4749 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_sli4_async_fc_evt()
4753 * lpfc_sli4_async_sli_evt - Process the asynchronous SLI link event
4774 "2901 Async SLI event - Event Data1:x%08x Event Data2:" in lpfc_sli4_async_sli_evt()
4776 acqe_sli->event_data1, acqe_sli->event_data2, in lpfc_sli4_async_sli_evt()
4779 port_name = phba->Port[0]; in lpfc_sli4_async_sli_evt()
4787 temp_event_data.data = (uint32_t)acqe_sli->event_data1; in lpfc_sli4_async_sli_evt()
4790 "3190 Over Temperature:%d Celsius- Port Name %c\n", in lpfc_sli4_async_sli_evt()
4791 acqe_sli->event_data1, port_name); in lpfc_sli4_async_sli_evt()
4793 phba->sfp_warning |= LPFC_TRANSGRESSION_HIGH_TEMPERATURE; in lpfc_sli4_async_sli_evt()
4794 shost = lpfc_shost_from_vport(phba->pport); in lpfc_sli4_async_sli_evt()
4804 temp_event_data.data = (uint32_t)acqe_sli->event_data1; in lpfc_sli4_async_sli_evt()
4807 "3191 Normal Temperature:%d Celsius - Port Name %c\n", in lpfc_sli4_async_sli_evt()
4808 acqe_sli->event_data1, port_name); in lpfc_sli4_async_sli_evt()
4810 shost = lpfc_shost_from_vport(phba->pport); in lpfc_sli4_async_sli_evt()
4819 &acqe_sli->event_data1; in lpfc_sli4_async_sli_evt()
4822 switch (phba->sli4_hba.lnk_info.lnk_no) { in lpfc_sli4_async_sli_evt()
4825 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4827 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4831 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4833 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4837 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4839 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4843 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4845 &misconfigured->theEvent); in lpfc_sli4_async_sli_evt()
4852 phba->sli4_hba.lnk_info.lnk_no); in lpfc_sli4_async_sli_evt()
4857 if (phba->sli4_hba.lnk_info.optic_state == status) in lpfc_sli4_async_sli_evt()
4866 "installed/not installed - Reseat optics, " in lpfc_sli4_async_sli_evt()
4871 "Optics of two types installed - Remove one " in lpfc_sli4_async_sli_evt()
4875 sprintf(message, "Incompatible optics - Replace with " in lpfc_sli4_async_sli_evt()
4879 sprintf(message, "Unqualified optics - Replace with " in lpfc_sli4_async_sli_evt()
4881 "Support - Link is%s operational", in lpfc_sli4_async_sli_evt()
4885 sprintf(message, "Uncertified optics - Replace with " in lpfc_sli4_async_sli_evt()
4886 "Avago-certified optics to enable link " in lpfc_sli4_async_sli_evt()
4887 "operation - Link is%s operational", in lpfc_sli4_async_sli_evt()
4895 phba->sli4_hba.lnk_info.optic_state = status; in lpfc_sli4_async_sli_evt()
4901 "3192 Remote DPort Test Initiated - " in lpfc_sli4_async_sli_evt()
4903 acqe_sli->event_data1, acqe_sli->event_data2); in lpfc_sli4_async_sli_evt()
4907 "3193 Async SLI event - Event Data1:x%08x Event Data2:" in lpfc_sli4_async_sli_evt()
4909 acqe_sli->event_data1, acqe_sli->event_data2, in lpfc_sli4_async_sli_evt()
4916 * lpfc_sli4_perform_vport_cvl - Perform clear virtual link on a vport
4934 phba = vport->phba; in lpfc_sli4_perform_vport_cvl()
4944 ndlp->nlp_type |= NLP_FABRIC; in lpfc_sli4_perform_vport_cvl()
4948 /* re-setup ndlp without removing from node list */ in lpfc_sli4_perform_vport_cvl()
4953 if ((phba->pport->port_state < LPFC_FLOGI) && in lpfc_sli4_perform_vport_cvl()
4954 (phba->pport->port_state != LPFC_VPORT_FAILED)) in lpfc_sli4_perform_vport_cvl()
4957 if ((vport != phba->pport) && (vport->port_state < LPFC_FDISC) in lpfc_sli4_perform_vport_cvl()
4958 && (vport->port_state != LPFC_VPORT_FAILED)) in lpfc_sli4_perform_vport_cvl()
4965 spin_lock_irq(shost->host_lock); in lpfc_sli4_perform_vport_cvl()
4966 vport->fc_flag |= FC_VPORT_CVL_RCVD; in lpfc_sli4_perform_vport_cvl()
4967 spin_unlock_irq(shost->host_lock); in lpfc_sli4_perform_vport_cvl()
4973 * lpfc_sli4_perform_all_vport_cvl - Perform clear virtual link on all vports
4987 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) in lpfc_sli4_perform_all_vport_cvl()
4993 * lpfc_sli4_async_fip_evt - Process the asynchronous FCoE FIP event
5012 phba->fc_eventTag = acqe_fip->event_tag; in lpfc_sli4_async_fip_evt()
5013 phba->fcoe_eventtag = acqe_fip->event_tag; in lpfc_sli4_async_fip_evt()
5022 acqe_fip->event_tag, in lpfc_sli4_async_fip_evt()
5023 acqe_fip->index); in lpfc_sli4_async_fip_evt()
5029 acqe_fip->event_tag, in lpfc_sli4_async_fip_evt()
5030 acqe_fip->index); in lpfc_sli4_async_fip_evt()
5031 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_sli4_async_fip_evt()
5041 acqe_fip->index); in lpfc_sli4_async_fip_evt()
5042 rc = lpfc_sli4_read_fcf_rec(phba, acqe_fip->index); in lpfc_sli4_async_fip_evt()
5046 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5047 if (phba->hba_flag & FCF_TS_INPROG) { in lpfc_sli4_async_fip_evt()
5048 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5052 if (phba->fcf.fcf_flag & (FCF_REDISC_EVT | FCF_REDISC_PEND)) { in lpfc_sli4_async_fip_evt()
5053 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5058 if (phba->fcf.fcf_flag & FCF_SCAN_DONE) { in lpfc_sli4_async_fip_evt()
5059 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5062 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5064 /* Otherwise, scan the entire FCF table and re-discover SAN */ in lpfc_sli4_async_fip_evt()
5068 acqe_fip->event_tag, acqe_fip->index); in lpfc_sli4_async_fip_evt()
5081 acqe_fip->event_tag); in lpfc_sli4_async_fip_evt()
5085 phba->fcoe_cvl_eventtag = acqe_fip->event_tag; in lpfc_sli4_async_fip_evt()
5088 "tag:x%x\n", acqe_fip->index, acqe_fip->event_tag); in lpfc_sli4_async_fip_evt()
5093 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5094 if ((phba->fcf.fcf_flag & FCF_DISCOVERY) && in lpfc_sli4_async_fip_evt()
5095 (phba->fcf.current_rec.fcf_indx != acqe_fip->index)) { in lpfc_sli4_async_fip_evt()
5096 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5098 lpfc_sli4_fcf_rr_index_clear(phba, acqe_fip->index); in lpfc_sli4_async_fip_evt()
5101 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5104 if (phba->fcf.current_rec.fcf_indx != acqe_fip->index) in lpfc_sli4_async_fip_evt()
5113 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5115 phba->fcf.fcf_flag |= FCF_DEAD_DISC; in lpfc_sli4_async_fip_evt()
5116 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5121 "\n", acqe_fip->event_tag, acqe_fip->index); in lpfc_sli4_async_fip_evt()
5129 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5130 phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; in lpfc_sli4_async_fip_evt()
5131 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5148 phba->fcoe_cvl_eventtag = acqe_fip->event_tag; in lpfc_sli4_async_fip_evt()
5151 " tag 0x%x\n", acqe_fip->index, acqe_fip->event_tag); in lpfc_sli4_async_fip_evt()
5154 acqe_fip->index); in lpfc_sli4_async_fip_evt()
5162 for (i = 0; i <= phba->max_vports && vports[i] != NULL; in lpfc_sli4_async_fip_evt()
5164 if ((!(vports[i]->fc_flag & in lpfc_sli4_async_fip_evt()
5166 (vports[i]->port_state > LPFC_FDISC)) { in lpfc_sli4_async_fip_evt()
5175 * Don't re-instantiate if vport is marked for deletion. in lpfc_sli4_async_fip_evt()
5179 if (!(vport->load_flag & FC_UNLOADING) && in lpfc_sli4_async_fip_evt()
5183 * re-instantiate the Vlink using FDISC. in lpfc_sli4_async_fip_evt()
5185 mod_timer(&ndlp->nlp_delayfunc, in lpfc_sli4_async_fip_evt()
5188 spin_lock_irq(shost->host_lock); in lpfc_sli4_async_fip_evt()
5189 ndlp->nlp_flag |= NLP_DELAY_TMO; in lpfc_sli4_async_fip_evt()
5190 spin_unlock_irq(shost->host_lock); in lpfc_sli4_async_fip_evt()
5191 ndlp->nlp_last_elscmd = ELS_CMD_FDISC; in lpfc_sli4_async_fip_evt()
5192 vport->port_state = LPFC_FDISC; in lpfc_sli4_async_fip_evt()
5201 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5202 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_sli4_async_fip_evt()
5203 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5207 phba->fcf.fcf_flag |= FCF_ACVL_DISC; in lpfc_sli4_async_fip_evt()
5208 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5212 "evt_tag:x%x\n", acqe_fip->event_tag); in lpfc_sli4_async_fip_evt()
5220 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5221 phba->fcf.fcf_flag &= ~FCF_ACVL_DISC; in lpfc_sli4_async_fip_evt()
5222 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_fip_evt()
5224 * Last resort will be re-try on the in lpfc_sli4_async_fip_evt()
5239 "0x%x\n", event_type, acqe_fip->event_tag); in lpfc_sli4_async_fip_evt()
5245 * lpfc_sli4_async_dcbx_evt - Process the asynchronous dcbx event
5255 phba->fc_eventTag = acqe_dcbx->event_tag; in lpfc_sli4_async_dcbx_evt()
5262 * lpfc_sli4_async_grp5_evt - Process the asynchronous group5 event
5276 phba->fc_eventTag = acqe_grp5->event_tag; in lpfc_sli4_async_grp5_evt()
5277 phba->fcoe_eventtag = acqe_grp5->event_tag; in lpfc_sli4_async_grp5_evt()
5278 prev_ll_spd = phba->sli4_hba.link_state.logical_speed; in lpfc_sli4_async_grp5_evt()
5279 phba->sli4_hba.link_state.logical_speed = in lpfc_sli4_async_grp5_evt()
5284 phba->sli4_hba.link_state.logical_speed); in lpfc_sli4_async_grp5_evt()
5288 * lpfc_sli4_async_event_proc - Process all the pending asynchronous event
5299 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_event_proc()
5300 phba->hba_flag &= ~ASYNC_EVENT; in lpfc_sli4_async_event_proc()
5301 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_event_proc()
5303 while (!list_empty(&phba->sli4_hba.sp_asynce_work_queue)) { in lpfc_sli4_async_event_proc()
5305 spin_lock_irq(&phba->hbalock); in lpfc_sli4_async_event_proc()
5306 list_remove_head(&phba->sli4_hba.sp_asynce_work_queue, in lpfc_sli4_async_event_proc()
5308 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_async_event_proc()
5310 switch (bf_get(lpfc_trailer_code, &cq_event->cqe.mcqe_cmpl)) { in lpfc_sli4_async_event_proc()
5313 &cq_event->cqe.acqe_link); in lpfc_sli4_async_event_proc()
5316 lpfc_sli4_async_fip_evt(phba, &cq_event->cqe.acqe_fip); in lpfc_sli4_async_event_proc()
5320 &cq_event->cqe.acqe_dcbx); in lpfc_sli4_async_event_proc()
5324 &cq_event->cqe.acqe_grp5); in lpfc_sli4_async_event_proc()
5327 lpfc_sli4_async_fc_evt(phba, &cq_event->cqe.acqe_fc); in lpfc_sli4_async_event_proc()
5330 lpfc_sli4_async_sli_evt(phba, &cq_event->cqe.acqe_sli); in lpfc_sli4_async_event_proc()
5336 &cq_event->cqe.mcqe_cmpl)); in lpfc_sli4_async_event_proc()
5345 * lpfc_sli4_fcf_redisc_event_proc - Process fcf table rediscovery event
5355 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_redisc_event_proc()
5357 phba->fcf.fcf_flag &= ~FCF_REDISC_EVT; in lpfc_sli4_fcf_redisc_event_proc()
5359 phba->fcf.failover_rec.flag = 0; in lpfc_sli4_fcf_redisc_event_proc()
5361 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_sli4_fcf_redisc_event_proc()
5362 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_redisc_event_proc()
5364 /* Scan FCF table from the first entry to re-discover SAN */ in lpfc_sli4_fcf_redisc_event_proc()
5366 "2777 Start post-quiescent FCF table scan\n"); in lpfc_sli4_fcf_redisc_event_proc()
5375 * lpfc_api_table_setup - Set up per hba pci-device group func api jump table
5377 * @dev_grp: The HBA PCI-Device group number.
5379 * This routine is invoked to set up the per HBA PCI-Device group function
5382 * Return: 0 if success, otherwise -ENODEV
5389 /* Set up lpfc PCI-device group */ in lpfc_api_table_setup()
5390 phba->pci_dev_grp = dev_grp; in lpfc_api_table_setup()
5394 phba->sli_rev = LPFC_SLI_REV4; in lpfc_api_table_setup()
5399 return -ENODEV; in lpfc_api_table_setup()
5403 return -ENODEV; in lpfc_api_table_setup()
5407 return -ENODEV; in lpfc_api_table_setup()
5411 return -ENODEV; in lpfc_api_table_setup()
5417 * lpfc_log_intr_mode - Log the active interrupt mode
5437 "0480 Enabled MSI-X interrupt mode.\n"); in lpfc_log_intr_mode()
5448 * lpfc_enable_pci_dev - Enable a generic PCI device.
5455 * 0 - successful
5456 * other values - error
5464 if (!phba->pcidev) in lpfc_enable_pci_dev()
5467 pdev = phba->pcidev; in lpfc_enable_pci_dev()
5481 pdev->needs_freset = 1; in lpfc_enable_pci_dev()
5490 return -ENODEV; in lpfc_enable_pci_dev()
5494 * lpfc_disable_pci_dev - Disable a generic PCI device.
5506 if (!phba->pcidev) in lpfc_disable_pci_dev()
5509 pdev = phba->pcidev; in lpfc_disable_pci_dev()
5518 * lpfc_reset_hba - Reset a hba
5530 if (!phba->cfg_enable_hba_reset) { in lpfc_reset_hba()
5531 phba->link_state = LPFC_HBA_ERROR; in lpfc_reset_hba()
5534 if (phba->sli.sli_flag & LPFC_SLI_ACTIVE) in lpfc_reset_hba()
5545 * lpfc_sli_sriov_nr_virtfn_get - Get the number of sr-iov virtual functions
5548 * This function enables the PCI SR-IOV virtual functions to a physical
5549 * function. It invokes the PCI SR-IOV api with the @nr_vfn provided to
5551 * not all devices support SR-IOV, the return code from the pci_enable_sriov()
5557 struct pci_dev *pdev = phba->pcidev; in lpfc_sli_sriov_nr_virtfn_get()
5570 * lpfc_sli_probe_sriov_nr_virtfn - Enable a number of sr-iov virtual functions
5574 * This function enables the PCI SR-IOV virtual functions to a physical
5575 * function. It invokes the PCI SR-IOV api with the @nr_vfn provided to
5577 * not all devices support SR-IOV, the return code from the pci_enable_sriov()
5583 struct pci_dev *pdev = phba->pcidev; in lpfc_sli_probe_sriov_nr_virtfn()
5592 return -EINVAL; in lpfc_sli_probe_sriov_nr_virtfn()
5609 * lpfc_setup_driver_resource_phase1 - Phase1 etup driver internal resources.
5616 * 0 - successful
5617 * other values - error
5622 struct lpfc_sli *psli = &phba->sli; in lpfc_setup_driver_resource_phase1()
5627 atomic_set(&phba->fast_event_count, 0); in lpfc_setup_driver_resource_phase1()
5628 spin_lock_init(&phba->hbalock); in lpfc_setup_driver_resource_phase1()
5631 spin_lock_init(&phba->ndlp_lock); in lpfc_setup_driver_resource_phase1()
5633 INIT_LIST_HEAD(&phba->port_list); in lpfc_setup_driver_resource_phase1()
5634 INIT_LIST_HEAD(&phba->work_list); in lpfc_setup_driver_resource_phase1()
5635 init_waitqueue_head(&phba->wait_4_mlo_m_q); in lpfc_setup_driver_resource_phase1()
5638 init_waitqueue_head(&phba->work_waitq); in lpfc_setup_driver_resource_phase1()
5642 ((phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) ? in lpfc_setup_driver_resource_phase1()
5644 ((phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) ? in lpfc_setup_driver_resource_phase1()
5646 (phba->nvmet_support ? "NVMET" : " ")); in lpfc_setup_driver_resource_phase1()
5648 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) { in lpfc_setup_driver_resource_phase1()
5650 spin_lock_init(&phba->scsi_buf_list_get_lock); in lpfc_setup_driver_resource_phase1()
5651 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_get); in lpfc_setup_driver_resource_phase1()
5652 spin_lock_init(&phba->scsi_buf_list_put_lock); in lpfc_setup_driver_resource_phase1()
5653 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_put); in lpfc_setup_driver_resource_phase1()
5656 if ((phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) && in lpfc_setup_driver_resource_phase1()
5657 (phba->nvmet_support == 0)) { in lpfc_setup_driver_resource_phase1()
5659 spin_lock_init(&phba->nvme_buf_list_get_lock); in lpfc_setup_driver_resource_phase1()
5660 INIT_LIST_HEAD(&phba->lpfc_nvme_buf_list_get); in lpfc_setup_driver_resource_phase1()
5661 phba->get_nvme_bufs = 0; in lpfc_setup_driver_resource_phase1()
5662 spin_lock_init(&phba->nvme_buf_list_put_lock); in lpfc_setup_driver_resource_phase1()
5663 INIT_LIST_HEAD(&phba->lpfc_nvme_buf_list_put); in lpfc_setup_driver_resource_phase1()
5664 phba->put_nvme_bufs = 0; in lpfc_setup_driver_resource_phase1()
5668 INIT_LIST_HEAD(&phba->fabric_iocb_list); in lpfc_setup_driver_resource_phase1()
5671 INIT_LIST_HEAD(&phba->elsbuf); in lpfc_setup_driver_resource_phase1()
5674 INIT_LIST_HEAD(&phba->fcf_conn_rec_list); in lpfc_setup_driver_resource_phase1()
5677 spin_lock_init(&phba->devicelock); in lpfc_setup_driver_resource_phase1()
5678 INIT_LIST_HEAD(&phba->luns); in lpfc_setup_driver_resource_phase1()
5681 timer_setup(&psli->mbox_tmo, lpfc_mbox_timeout, 0); in lpfc_setup_driver_resource_phase1()
5683 timer_setup(&phba->fabric_block_timer, lpfc_fabric_block_timeout, 0); in lpfc_setup_driver_resource_phase1()
5685 timer_setup(&phba->eratt_poll, lpfc_poll_eratt, 0); in lpfc_setup_driver_resource_phase1()
5687 timer_setup(&phba->hb_tmofunc, lpfc_hb_timeout, 0); in lpfc_setup_driver_resource_phase1()
5693 * lpfc_sli_driver_resource_setup - Setup driver internal resources for SLI3 dev
5697 * support the SLI-3 HBA device it attached to.
5700 * 0 - successful
5701 * other values - error
5713 timer_setup(&phba->fcp_poll_timer, lpfc_poll_timeout, 0); in lpfc_sli_driver_resource_setup()
5716 phba->work_ha_mask = (HA_ERATT | HA_MBATT | HA_LATT); in lpfc_sli_driver_resource_setup()
5717 phba->work_ha_mask |= (HA_RXMASK << (LPFC_ELS_RING * 4)); in lpfc_sli_driver_resource_setup()
5721 /* Set up phase-1 common device driver resources */ in lpfc_sli_driver_resource_setup()
5725 return -ENODEV; in lpfc_sli_driver_resource_setup()
5727 if (phba->pcidev->device == PCI_DEVICE_ID_HORNET) { in lpfc_sli_driver_resource_setup()
5728 phba->menlo_flag |= HBA_MENLO_SUPPORT; in lpfc_sli_driver_resource_setup()
5730 if (phba->cfg_sg_seg_cnt < LPFC_DEFAULT_MENLO_SG_SEG_CNT) in lpfc_sli_driver_resource_setup()
5731 phba->cfg_sg_seg_cnt = LPFC_DEFAULT_MENLO_SG_SEG_CNT; in lpfc_sli_driver_resource_setup()
5734 if (!phba->sli.sli3_ring) in lpfc_sli_driver_resource_setup()
5735 phba->sli.sli3_ring = kcalloc(LPFC_SLI3_MAX_RING, in lpfc_sli_driver_resource_setup()
5738 if (!phba->sli.sli3_ring) in lpfc_sli_driver_resource_setup()
5739 return -ENOMEM; in lpfc_sli_driver_resource_setup()
5747 lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli_driver_resource_setup()
5748 lpfc_template_no_hr.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli_driver_resource_setup()
5749 lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli_driver_resource_setup()
5752 if (phba->cfg_enable_bg) { in lpfc_sli_driver_resource_setup()
5754 * The scsi_buf for a T10-DIF I/O will hold the FCP cmnd, in lpfc_sli_driver_resource_setup()
5762 phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + in lpfc_sli_driver_resource_setup()
5766 if (phba->cfg_sg_seg_cnt > LPFC_MAX_SG_SEG_CNT_DIF) in lpfc_sli_driver_resource_setup()
5767 phba->cfg_sg_seg_cnt = LPFC_MAX_SG_SEG_CNT_DIF; in lpfc_sli_driver_resource_setup()
5770 phba->cfg_total_seg_cnt = LPFC_MAX_SG_SEG_CNT; in lpfc_sli_driver_resource_setup()
5777 phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + in lpfc_sli_driver_resource_setup()
5779 ((phba->cfg_sg_seg_cnt + 2) * sizeof(struct ulp_bde64)); in lpfc_sli_driver_resource_setup()
5782 phba->cfg_total_seg_cnt = phba->cfg_sg_seg_cnt + 2; in lpfc_sli_driver_resource_setup()
5787 phba->cfg_sg_seg_cnt, phba->cfg_sg_dma_buf_size, in lpfc_sli_driver_resource_setup()
5788 phba->cfg_total_seg_cnt); in lpfc_sli_driver_resource_setup()
5790 phba->max_vpi = LPFC_MAX_VPI; in lpfc_sli_driver_resource_setup()
5792 phba->max_vports = 0; in lpfc_sli_driver_resource_setup()
5802 return -ENOMEM; in lpfc_sli_driver_resource_setup()
5805 * Enable sr-iov virtual functions if supported and configured in lpfc_sli_driver_resource_setup()
5808 if (phba->cfg_sriov_nr_virtfn > 0) { in lpfc_sli_driver_resource_setup()
5810 phba->cfg_sriov_nr_virtfn); in lpfc_sli_driver_resource_setup()
5813 "2808 Requested number of SR-IOV " in lpfc_sli_driver_resource_setup()
5816 phba->cfg_sriov_nr_virtfn); in lpfc_sli_driver_resource_setup()
5817 phba->cfg_sriov_nr_virtfn = 0; in lpfc_sli_driver_resource_setup()
5825 * lpfc_sli_driver_resource_unset - Unset drvr internal resources for SLI3 dev
5829 * specific for supporting the SLI-3 HBA device it attached to.
5841 * lpfc_sli4_driver_resource_setup - Setup drvr internal resources for SLI4 dev
5845 * support the SLI-4 HBA device it attached to.
5848 * 0 - successful
5849 * other values - error
5866 phba->sli4_hba.num_online_cpu = num_online_cpus(); in lpfc_sli4_driver_resource_setup()
5867 phba->sli4_hba.num_present_cpu = lpfc_present_cpu; in lpfc_sli4_driver_resource_setup()
5868 phba->sli4_hba.curr_disp_cpu = 0; in lpfc_sli4_driver_resource_setup()
5873 /* Set up phase-1 common device driver resources */ in lpfc_sli4_driver_resource_setup()
5876 return -ENODEV; in lpfc_sli4_driver_resource_setup()
5881 return -ENODEV; in lpfc_sli4_driver_resource_setup()
5887 timer_setup(&phba->rrq_tmr, lpfc_rrq_timeout, 0); in lpfc_sli4_driver_resource_setup()
5890 timer_setup(&phba->fcf.redisc_wait, lpfc_sli4_fcf_redisc_wait_tmo, 0); in lpfc_sli4_driver_resource_setup()
5893 * Control structure for handling external multi-buffer mailbox in lpfc_sli4_driver_resource_setup()
5894 * command pass-through. in lpfc_sli4_driver_resource_setup()
5896 memset((uint8_t *)&phba->mbox_ext_buf_ctx, 0, in lpfc_sli4_driver_resource_setup()
5898 INIT_LIST_HEAD(&phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_sli4_driver_resource_setup()
5900 phba->max_vpi = LPFC_MAX_VPI; in lpfc_sli4_driver_resource_setup()
5903 phba->max_vports = 0; in lpfc_sli4_driver_resource_setup()
5906 phba->valid_vlan = 0; in lpfc_sli4_driver_resource_setup()
5907 phba->fc_map[0] = LPFC_FCOE_FCF_MAP0; in lpfc_sli4_driver_resource_setup()
5908 phba->fc_map[1] = LPFC_FCOE_FCF_MAP1; in lpfc_sli4_driver_resource_setup()
5909 phba->fc_map[2] = LPFC_FCOE_FCF_MAP2; in lpfc_sli4_driver_resource_setup()
5922 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) in lpfc_sli4_driver_resource_setup()
5931 if (phba->cfg_sg_seg_cnt > LPFC_MAX_SGL_SEG_CNT - extra) in lpfc_sli4_driver_resource_setup()
5932 phba->cfg_sg_seg_cnt = LPFC_MAX_SGL_SEG_CNT - extra; in lpfc_sli4_driver_resource_setup()
5938 if (phba->sli3_options & LPFC_SLI3_BG_ENABLED) { in lpfc_sli4_driver_resource_setup()
5940 * The scsi_buf for a T10-DIF I/O holds the FCP cmnd, in lpfc_sli4_driver_resource_setup()
5948 phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + in lpfc_sli4_driver_resource_setup()
5952 phba->cfg_total_seg_cnt = LPFC_MAX_SGL_SEG_CNT; in lpfc_sli4_driver_resource_setup()
5954 if (phba->cfg_sg_seg_cnt > LPFC_MAX_SG_SLI4_SEG_CNT_DIF) in lpfc_sli4_driver_resource_setup()
5955 phba->cfg_sg_seg_cnt = in lpfc_sli4_driver_resource_setup()
5963 phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + in lpfc_sli4_driver_resource_setup()
5965 ((phba->cfg_sg_seg_cnt + extra) * in lpfc_sli4_driver_resource_setup()
5969 phba->cfg_total_seg_cnt = phba->cfg_sg_seg_cnt + extra; in lpfc_sli4_driver_resource_setup()
5972 * NOTE: if (phba->cfg_sg_seg_cnt + extra) <= 256 we only in lpfc_sli4_driver_resource_setup()
5978 lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli4_driver_resource_setup()
5979 lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli4_driver_resource_setup()
5980 lpfc_template_no_hr.sg_tablesize = phba->cfg_sg_seg_cnt; in lpfc_sli4_driver_resource_setup()
5982 if (phba->cfg_sg_dma_buf_size <= LPFC_MIN_SG_SLI4_BUF_SZ) in lpfc_sli4_driver_resource_setup()
5983 phba->cfg_sg_dma_buf_size = LPFC_MIN_SG_SLI4_BUF_SZ; in lpfc_sli4_driver_resource_setup()
5985 phba->cfg_sg_dma_buf_size = in lpfc_sli4_driver_resource_setup()
5986 SLI4_PAGE_ALIGN(phba->cfg_sg_dma_buf_size); in lpfc_sli4_driver_resource_setup()
5990 phba->cfg_sg_seg_cnt, phba->cfg_sg_dma_buf_size, in lpfc_sli4_driver_resource_setup()
5991 phba->cfg_total_seg_cnt); in lpfc_sli4_driver_resource_setup()
5994 INIT_LIST_HEAD(&phba->hbqs[LPFC_ELS_HBQ].hbq_buffer_list); in lpfc_sli4_driver_resource_setup()
5995 phba->hbqs[LPFC_ELS_HBQ].hbq_alloc_buffer = lpfc_sli4_rb_alloc; in lpfc_sli4_driver_resource_setup()
5996 phba->hbqs[LPFC_ELS_HBQ].hbq_free_buffer = lpfc_sli4_rb_free; in lpfc_sli4_driver_resource_setup()
6001 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) { in lpfc_sli4_driver_resource_setup()
6003 spin_lock_init(&phba->sli4_hba.abts_scsi_buf_list_lock); in lpfc_sli4_driver_resource_setup()
6004 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_scsi_buf_list); in lpfc_sli4_driver_resource_setup()
6007 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_sli4_driver_resource_setup()
6009 spin_lock_init(&phba->sli4_hba.abts_nvme_buf_list_lock); in lpfc_sli4_driver_resource_setup()
6010 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvme_buf_list); in lpfc_sli4_driver_resource_setup()
6011 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list); in lpfc_sli4_driver_resource_setup()
6012 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_io_wait_list); in lpfc_sli4_driver_resource_setup()
6016 spin_lock_init(&phba->sli4_hba.sgl_list_lock); in lpfc_sli4_driver_resource_setup()
6017 spin_lock_init(&phba->sli4_hba.nvmet_io_wait_lock); in lpfc_sli4_driver_resource_setup()
6020 * Initialize driver internal slow-path work queues in lpfc_sli4_driver_resource_setup()
6023 /* Driver internel slow-path CQ Event pool */ in lpfc_sli4_driver_resource_setup()
6024 INIT_LIST_HEAD(&phba->sli4_hba.sp_cqe_event_pool); in lpfc_sli4_driver_resource_setup()
6026 INIT_LIST_HEAD(&phba->sli4_hba.sp_queue_event); in lpfc_sli4_driver_resource_setup()
6028 INIT_LIST_HEAD(&phba->sli4_hba.sp_asynce_work_queue); in lpfc_sli4_driver_resource_setup()
6029 /* Fast-path XRI aborted CQ Event work queue list */ in lpfc_sli4_driver_resource_setup()
6030 INIT_LIST_HEAD(&phba->sli4_hba.sp_fcp_xri_aborted_work_queue); in lpfc_sli4_driver_resource_setup()
6031 /* Slow-path XRI aborted CQ Event work queue list */ in lpfc_sli4_driver_resource_setup()
6032 INIT_LIST_HEAD(&phba->sli4_hba.sp_els_xri_aborted_work_queue); in lpfc_sli4_driver_resource_setup()
6034 INIT_LIST_HEAD(&phba->sli4_hba.sp_unsol_work_queue); in lpfc_sli4_driver_resource_setup()
6037 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_rpi_blk_list); in lpfc_sli4_driver_resource_setup()
6038 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_xri_blk_list); in lpfc_sli4_driver_resource_setup()
6039 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_vfi_blk_list); in lpfc_sli4_driver_resource_setup()
6040 INIT_LIST_HEAD(&phba->lpfc_vpi_blk_list); in lpfc_sli4_driver_resource_setup()
6045 INIT_LIST_HEAD(&phba->sli.mboxq); in lpfc_sli4_driver_resource_setup()
6046 INIT_LIST_HEAD(&phba->sli.mboxq_cmpl); in lpfc_sli4_driver_resource_setup()
6049 phba->sli4_hba.lnk_info.optic_state = 0xff; in lpfc_sli4_driver_resource_setup()
6054 return -ENOMEM; in lpfc_sli4_driver_resource_setup()
6057 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_sli4_driver_resource_setup()
6061 rc = -ENODEV; in lpfc_sli4_driver_resource_setup()
6064 phba->temp_sensor_support = 1; in lpfc_sli4_driver_resource_setup()
6086 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == in lpfc_sli4_driver_resource_setup()
6093 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, in lpfc_sli4_driver_resource_setup()
6096 rc = -ENOMEM; in lpfc_sli4_driver_resource_setup()
6101 phba->nvmet_support = 0; in lpfc_sli4_driver_resource_setup()
6111 bf_get(lpfc_mqe_command, &mboxq->u.mqe), in lpfc_sli4_driver_resource_setup()
6112 bf_get(lpfc_mqe_status, &mboxq->u.mqe)); in lpfc_sli4_driver_resource_setup()
6113 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_driver_resource_setup()
6114 rc = -EIO; in lpfc_sli4_driver_resource_setup()
6117 mb = &mboxq->u.mb; in lpfc_sli4_driver_resource_setup()
6118 memcpy(&wwn, (char *)mb->un.varRDnvp.nodename, in lpfc_sli4_driver_resource_setup()
6121 phba->sli4_hba.wwnn.u.name = wwn; in lpfc_sli4_driver_resource_setup()
6122 memcpy(&wwn, (char *)mb->un.varRDnvp.portname, in lpfc_sli4_driver_resource_setup()
6126 phba->sli4_hba.wwpn.u.name = wwn; in lpfc_sli4_driver_resource_setup()
6135 phba->nvmet_support = 1; /* a match */ in lpfc_sli4_driver_resource_setup()
6157 mqe = &mboxq->u.mqe; in lpfc_sli4_driver_resource_setup()
6158 memcpy(&pn_page[0], ((uint8_t *)&mqe->un.supp_pages.word3), in lpfc_sli4_driver_resource_setup()
6163 phba->sli4_hba.pc_sli4_params.supported = 1; in lpfc_sli4_driver_resource_setup()
6170 if (phba->sli4_hba.pc_sli4_params.supported) in lpfc_sli4_driver_resource_setup()
6173 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_driver_resource_setup()
6174 rc = -EIO; in lpfc_sli4_driver_resource_setup()
6187 &phba->sli4_hba.sli_intf); in lpfc_sli4_driver_resource_setup()
6189 &phba->sli4_hba.sli_intf); in lpfc_sli4_driver_resource_setup()
6190 if (phba->sli4_hba.extents_in_use && in lpfc_sli4_driver_resource_setup()
6191 phba->sli4_hba.rpi_hdrs_in_use) { in lpfc_sli4_driver_resource_setup()
6197 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_driver_resource_setup()
6198 rc = -EIO; in lpfc_sli4_driver_resource_setup()
6204 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_driver_resource_setup()
6205 rc = -EIO; in lpfc_sli4_driver_resource_setup()
6210 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_driver_resource_setup()
6214 if (phba->cfg_fof) in lpfc_sli4_driver_resource_setup()
6245 longs = (LPFC_SLI4_FCF_TBL_INDX_MAX + BITS_PER_LONG - 1)/BITS_PER_LONG; in lpfc_sli4_driver_resource_setup()
6246 phba->fcf.fcf_rr_bmask = kcalloc(longs, sizeof(unsigned long), in lpfc_sli4_driver_resource_setup()
6248 if (!phba->fcf.fcf_rr_bmask) { in lpfc_sli4_driver_resource_setup()
6252 rc = -ENOMEM; in lpfc_sli4_driver_resource_setup()
6256 phba->sli4_hba.hba_eq_hdl = kcalloc(fof_vectors + phba->io_channel_irqs, in lpfc_sli4_driver_resource_setup()
6259 if (!phba->sli4_hba.hba_eq_hdl) { in lpfc_sli4_driver_resource_setup()
6262 "fast-path per-EQ handle array\n"); in lpfc_sli4_driver_resource_setup()
6263 rc = -ENOMEM; in lpfc_sli4_driver_resource_setup()
6267 phba->sli4_hba.cpu_map = kcalloc(phba->sli4_hba.num_present_cpu, in lpfc_sli4_driver_resource_setup()
6270 if (!phba->sli4_hba.cpu_map) { in lpfc_sli4_driver_resource_setup()
6272 "3327 Failed allocate memory for msi-x " in lpfc_sli4_driver_resource_setup()
6274 rc = -ENOMEM; in lpfc_sli4_driver_resource_setup()
6282 "3335 Failed allocate memory for msi-x " in lpfc_sli4_driver_resource_setup()
6284 kfree(phba->sli4_hba.cpu_map); in lpfc_sli4_driver_resource_setup()
6285 rc = -ENOMEM; in lpfc_sli4_driver_resource_setup()
6293 * Enable sr-iov virtual functions if supported and configured in lpfc_sli4_driver_resource_setup()
6296 if (phba->cfg_sriov_nr_virtfn > 0) { in lpfc_sli4_driver_resource_setup()
6298 phba->cfg_sriov_nr_virtfn); in lpfc_sli4_driver_resource_setup()
6301 "3020 Requested number of SR-IOV " in lpfc_sli4_driver_resource_setup()
6304 phba->cfg_sriov_nr_virtfn); in lpfc_sli4_driver_resource_setup()
6305 phba->cfg_sriov_nr_virtfn = 0; in lpfc_sli4_driver_resource_setup()
6312 kfree(phba->sli4_hba.hba_eq_hdl); in lpfc_sli4_driver_resource_setup()
6314 kfree(phba->fcf.fcf_rr_bmask); in lpfc_sli4_driver_resource_setup()
6329 * lpfc_sli4_driver_resource_unset - Unset drvr internal resources for SLI4 dev
6333 * specific for supporting the SLI-4 HBA device it attached to.
6340 /* Free memory allocated for msi-x interrupt vector to CPU mapping */ in lpfc_sli4_driver_resource_unset()
6341 kfree(phba->sli4_hba.cpu_map); in lpfc_sli4_driver_resource_unset()
6342 phba->sli4_hba.num_present_cpu = 0; in lpfc_sli4_driver_resource_unset()
6343 phba->sli4_hba.num_online_cpu = 0; in lpfc_sli4_driver_resource_unset()
6344 phba->sli4_hba.curr_disp_cpu = 0; in lpfc_sli4_driver_resource_unset()
6346 /* Free memory allocated for fast-path work queue handles */ in lpfc_sli4_driver_resource_unset()
6347 kfree(phba->sli4_hba.hba_eq_hdl); in lpfc_sli4_driver_resource_unset()
6354 kfree(phba->fcf.fcf_rr_bmask); in lpfc_sli4_driver_resource_unset()
6376 &phba->fcf_conn_rec_list, list) { in lpfc_sli4_driver_resource_unset()
6377 list_del_init(&conn_entry->list); in lpfc_sli4_driver_resource_unset()
6385 * lpfc_init_api_table_setup - Set up init api function jump table
6387 * @dev_grp: The HBA PCI-Device group number.
6392 * Returns: 0 - success, -ENODEV - failure.
6397 phba->lpfc_hba_init_link = lpfc_hba_init_link; in lpfc_init_api_table_setup()
6398 phba->lpfc_hba_down_link = lpfc_hba_down_link; in lpfc_init_api_table_setup()
6399 phba->lpfc_selective_reset = lpfc_selective_reset; in lpfc_init_api_table_setup()
6402 phba->lpfc_hba_down_post = lpfc_hba_down_post_s3; in lpfc_init_api_table_setup()
6403 phba->lpfc_handle_eratt = lpfc_handle_eratt_s3; in lpfc_init_api_table_setup()
6404 phba->lpfc_stop_port = lpfc_stop_port_s3; in lpfc_init_api_table_setup()
6407 phba->lpfc_hba_down_post = lpfc_hba_down_post_s4; in lpfc_init_api_table_setup()
6408 phba->lpfc_handle_eratt = lpfc_handle_eratt_s4; in lpfc_init_api_table_setup()
6409 phba->lpfc_stop_port = lpfc_stop_port_s4; in lpfc_init_api_table_setup()
6413 "1431 Invalid HBA PCI-device group: 0x%x\n", in lpfc_init_api_table_setup()
6415 return -ENODEV; in lpfc_init_api_table_setup()
6422 * lpfc_setup_driver_resource_phase2 - Phase2 setup driver internal resources.
6429 * 0 - successful
6430 * other values - error
6438 phba->worker_thread = kthread_run(lpfc_do_work, phba, in lpfc_setup_driver_resource_phase2()
6439 "lpfc_worker_%d", phba->brd_no); in lpfc_setup_driver_resource_phase2()
6440 if (IS_ERR(phba->worker_thread)) { in lpfc_setup_driver_resource_phase2()
6441 error = PTR_ERR(phba->worker_thread); in lpfc_setup_driver_resource_phase2()
6446 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_setup_driver_resource_phase2()
6447 phba->wq = alloc_workqueue("lpfc_wq", WQ_MEM_RECLAIM, 0); in lpfc_setup_driver_resource_phase2()
6449 phba->wq = NULL; in lpfc_setup_driver_resource_phase2()
6455 * lpfc_unset_driver_resource_phase2 - Phase2 unset driver internal resources.
6465 if (phba->wq) { in lpfc_unset_driver_resource_phase2()
6466 flush_workqueue(phba->wq); in lpfc_unset_driver_resource_phase2()
6467 destroy_workqueue(phba->wq); in lpfc_unset_driver_resource_phase2()
6468 phba->wq = NULL; in lpfc_unset_driver_resource_phase2()
6472 if (phba->worker_thread) in lpfc_unset_driver_resource_phase2()
6473 kthread_stop(phba->worker_thread); in lpfc_unset_driver_resource_phase2()
6477 * lpfc_free_iocb_list - Free iocb list.
6487 spin_lock_irq(&phba->hbalock); in lpfc_free_iocb_list()
6489 &phba->lpfc_iocb_list, list) { in lpfc_free_iocb_list()
6490 list_del(&iocbq_entry->list); in lpfc_free_iocb_list()
6492 phba->total_iocbq_bufs--; in lpfc_free_iocb_list()
6494 spin_unlock_irq(&phba->hbalock); in lpfc_free_iocb_list()
6500 * lpfc_init_iocb_list - Allocate and initialize iocb list.
6507 * 0 - successful
6508 * other values - error
6518 INIT_LIST_HEAD(&phba->lpfc_iocb_list); in lpfc_init_iocb_list()
6535 iocbq_entry->sli4_lxritag = NO_XRI; in lpfc_init_iocb_list()
6536 iocbq_entry->sli4_xritag = NO_XRI; in lpfc_init_iocb_list()
6538 spin_lock_irq(&phba->hbalock); in lpfc_init_iocb_list()
6539 list_add(&iocbq_entry->list, &phba->lpfc_iocb_list); in lpfc_init_iocb_list()
6540 phba->total_iocbq_bufs++; in lpfc_init_iocb_list()
6541 spin_unlock_irq(&phba->hbalock); in lpfc_init_iocb_list()
6549 return -ENOMEM; in lpfc_init_iocb_list()
6553 * lpfc_free_sgl_list - Free a given sgl list.
6565 list_del(&sglq_entry->list); in lpfc_free_sgl_list()
6566 lpfc_mbuf_free(phba, sglq_entry->virt, sglq_entry->phys); in lpfc_free_sgl_list()
6572 * lpfc_free_els_sgl_list - Free els sgl list.
6583 spin_lock_irq(&phba->hbalock); in lpfc_free_els_sgl_list()
6584 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_free_els_sgl_list()
6585 list_splice_init(&phba->sli4_hba.lpfc_els_sgl_list, &sglq_list); in lpfc_free_els_sgl_list()
6586 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_free_els_sgl_list()
6587 spin_unlock_irq(&phba->hbalock); in lpfc_free_els_sgl_list()
6594 * lpfc_free_nvmet_sgl_list - Free nvmet sgl list.
6606 spin_lock_irq(&phba->hbalock); in lpfc_free_nvmet_sgl_list()
6607 spin_lock(&phba->sli4_hba.sgl_list_lock); in lpfc_free_nvmet_sgl_list()
6608 list_splice_init(&phba->sli4_hba.lpfc_nvmet_sgl_list, &sglq_list); in lpfc_free_nvmet_sgl_list()
6609 spin_unlock(&phba->sli4_hba.sgl_list_lock); in lpfc_free_nvmet_sgl_list()
6610 spin_unlock_irq(&phba->hbalock); in lpfc_free_nvmet_sgl_list()
6614 list_del(&sglq_entry->list); in lpfc_free_nvmet_sgl_list()
6615 lpfc_nvmet_buf_free(phba, sglq_entry->virt, sglq_entry->phys); in lpfc_free_nvmet_sgl_list()
6623 phba->sli4_hba.nvmet_xri_cnt = 0; in lpfc_free_nvmet_sgl_list()
6627 * lpfc_init_active_sgl_array - Allocate the buf to track active ELS XRIs.
6638 size *= phba->sli4_hba.max_cfg_param.max_xri; in lpfc_init_active_sgl_array()
6640 phba->sli4_hba.lpfc_sglq_active_list = in lpfc_init_active_sgl_array()
6642 if (!phba->sli4_hba.lpfc_sglq_active_list) in lpfc_init_active_sgl_array()
6643 return -ENOMEM; in lpfc_init_active_sgl_array()
6648 * lpfc_free_active_sgl - Free the buf that tracks active ELS XRIs.
6658 kfree(phba->sli4_hba.lpfc_sglq_active_list); in lpfc_free_active_sgl()
6662 * lpfc_init_sgl_list - Allocate and initialize sgl list.
6673 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_els_sgl_list); in lpfc_init_sgl_list()
6674 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_els_sgl_list); in lpfc_init_sgl_list()
6675 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_sgl_list); in lpfc_init_sgl_list()
6676 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list); in lpfc_init_sgl_list()
6678 /* els xri-sgl book keeping */ in lpfc_init_sgl_list()
6679 phba->sli4_hba.els_xri_cnt = 0; in lpfc_init_sgl_list()
6681 /* scsi xri-buffer book keeping */ in lpfc_init_sgl_list()
6682 phba->sli4_hba.scsi_xri_cnt = 0; in lpfc_init_sgl_list()
6684 /* nvme xri-buffer book keeping */ in lpfc_init_sgl_list()
6685 phba->sli4_hba.nvme_xri_cnt = 0; in lpfc_init_sgl_list()
6689 * lpfc_sli4_init_rpi_hdrs - Post the rpi header memory region to the port
6699 * 0 - successful
6700 * -ERROR - otherwise.
6708 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_rpi_hdr_list); in lpfc_sli4_init_rpi_hdrs()
6709 if (!phba->sli4_hba.rpi_hdrs_in_use) in lpfc_sli4_init_rpi_hdrs()
6711 if (phba->sli4_hba.extents_in_use) in lpfc_sli4_init_rpi_hdrs()
6712 return -EIO; in lpfc_sli4_init_rpi_hdrs()
6719 rc = -ENODEV; in lpfc_sli4_init_rpi_hdrs()
6726 * lpfc_sli4_create_rpi_hdr - Allocate an rpi header memory region
6750 if (!phba->sli4_hba.rpi_hdrs_in_use) in lpfc_sli4_create_rpi_hdr()
6752 if (phba->sli4_hba.extents_in_use) in lpfc_sli4_create_rpi_hdr()
6756 rpi_limit = phba->sli4_hba.max_cfg_param.max_rpi; in lpfc_sli4_create_rpi_hdr()
6758 spin_lock_irq(&phba->hbalock); in lpfc_sli4_create_rpi_hdr()
6764 curr_rpi_range = phba->sli4_hba.next_rpi; in lpfc_sli4_create_rpi_hdr()
6765 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_create_rpi_hdr()
6773 * port expects a 4KB DMA-mapped memory region that is 4K aligned. in lpfc_sli4_create_rpi_hdr()
6779 dmabuf->virt = dma_zalloc_coherent(&phba->pcidev->dev, in lpfc_sli4_create_rpi_hdr()
6781 &dmabuf->phys, GFP_KERNEL); in lpfc_sli4_create_rpi_hdr()
6782 if (!dmabuf->virt) { in lpfc_sli4_create_rpi_hdr()
6787 if (!IS_ALIGNED(dmabuf->phys, LPFC_HDR_TEMPLATE_SIZE)) { in lpfc_sli4_create_rpi_hdr()
6797 rpi_hdr->dmabuf = dmabuf; in lpfc_sli4_create_rpi_hdr()
6798 rpi_hdr->len = LPFC_HDR_TEMPLATE_SIZE; in lpfc_sli4_create_rpi_hdr()
6799 rpi_hdr->page_count = 1; in lpfc_sli4_create_rpi_hdr()
6800 spin_lock_irq(&phba->hbalock); in lpfc_sli4_create_rpi_hdr()
6803 rpi_hdr->start_rpi = curr_rpi_range; in lpfc_sli4_create_rpi_hdr()
6804 rpi_hdr->next_rpi = phba->sli4_hba.next_rpi + LPFC_RPI_HDR_COUNT; in lpfc_sli4_create_rpi_hdr()
6805 list_add_tail(&rpi_hdr->list, &phba->sli4_hba.lpfc_rpi_hdr_list); in lpfc_sli4_create_rpi_hdr()
6807 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_create_rpi_hdr()
6811 dma_free_coherent(&phba->pcidev->dev, LPFC_HDR_TEMPLATE_SIZE, in lpfc_sli4_create_rpi_hdr()
6812 dmabuf->virt, dmabuf->phys); in lpfc_sli4_create_rpi_hdr()
6819 * lpfc_sli4_remove_rpi_hdrs - Remove all rpi header memory regions
6832 if (!phba->sli4_hba.rpi_hdrs_in_use) in lpfc_sli4_remove_rpi_hdrs()
6836 &phba->sli4_hba.lpfc_rpi_hdr_list, list) { in lpfc_sli4_remove_rpi_hdrs()
6837 list_del(&rpi_hdr->list); in lpfc_sli4_remove_rpi_hdrs()
6838 dma_free_coherent(&phba->pcidev->dev, rpi_hdr->len, in lpfc_sli4_remove_rpi_hdrs()
6839 rpi_hdr->dmabuf->virt, rpi_hdr->dmabuf->phys); in lpfc_sli4_remove_rpi_hdrs()
6840 kfree(rpi_hdr->dmabuf); in lpfc_sli4_remove_rpi_hdrs()
6845 phba->sli4_hba.next_rpi = 0; in lpfc_sli4_remove_rpi_hdrs()
6849 * lpfc_hba_alloc - Allocate driver hba data structure for a device.
6857 * pointer to @phba - successful
6858 * NULL - error
6868 dev_err(&pdev->dev, "failed to allocate hba struct\n"); in lpfc_hba_alloc()
6873 phba->pcidev = pdev; in lpfc_hba_alloc()
6876 phba->brd_no = lpfc_get_instance(); in lpfc_hba_alloc()
6877 if (phba->brd_no < 0) { in lpfc_hba_alloc()
6881 phba->eratt_poll_interval = LPFC_ERATT_POLL_INTERVAL; in lpfc_hba_alloc()
6883 spin_lock_init(&phba->ct_ev_lock); in lpfc_hba_alloc()
6884 INIT_LIST_HEAD(&phba->ct_ev_waiters); in lpfc_hba_alloc()
6890 * lpfc_hba_free - Free driver hba data structure with a device.
6900 idr_remove(&lpfc_hba_index, phba->brd_no); in lpfc_hba_free()
6903 kfree(phba->sli.sli3_ring); in lpfc_hba_free()
6904 phba->sli.sli3_ring = NULL; in lpfc_hba_free()
6911 * lpfc_create_shost - Create hba physical port with associated scsi host.
6918 * 0 - successful
6919 * other values - error
6928 phba->fc_edtov = FF_DEF_EDTOV; in lpfc_create_shost()
6929 phba->fc_ratov = FF_DEF_RATOV; in lpfc_create_shost()
6930 phba->fc_altov = FF_DEF_ALTOV; in lpfc_create_shost()
6931 phba->fc_arbtov = FF_DEF_ARBTOV; in lpfc_create_shost()
6933 atomic_set(&phba->sdev_cnt, 0); in lpfc_create_shost()
6934 atomic_set(&phba->fc4ScsiInputRequests, 0); in lpfc_create_shost()
6935 atomic_set(&phba->fc4ScsiOutputRequests, 0); in lpfc_create_shost()
6936 atomic_set(&phba->fc4ScsiControlRequests, 0); in lpfc_create_shost()
6937 atomic_set(&phba->fc4ScsiIoCmpls, 0); in lpfc_create_shost()
6938 vport = lpfc_create_port(phba, phba->brd_no, &phba->pcidev->dev); in lpfc_create_shost()
6940 return -ENODEV; in lpfc_create_shost()
6943 phba->pport = vport; in lpfc_create_shost()
6945 if (phba->nvmet_support) { in lpfc_create_shost()
6947 if (phba->txrdy_payload_pool == NULL) { in lpfc_create_shost()
6948 phba->txrdy_payload_pool = dma_pool_create( in lpfc_create_shost()
6949 "txrdy_pool", &phba->pcidev->dev, in lpfc_create_shost()
6951 if (phba->txrdy_payload_pool) { in lpfc_create_shost()
6952 phba->targetport = NULL; in lpfc_create_shost()
6953 phba->cfg_enable_fc4_type = LPFC_ENABLE_NVME; in lpfc_create_shost()
6963 pci_set_drvdata(phba->pcidev, shost); in lpfc_create_shost()
6969 vport->load_flag |= FC_ALLOW_FDMI; in lpfc_create_shost()
6970 if (phba->cfg_enable_SmartSAN || in lpfc_create_shost()
6971 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) { in lpfc_create_shost()
6974 vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR; in lpfc_create_shost()
6975 if (phba->cfg_enable_SmartSAN) in lpfc_create_shost()
6976 vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR; in lpfc_create_shost()
6978 vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR; in lpfc_create_shost()
6984 * lpfc_destroy_shost - Destroy hba physical port with associated scsi host.
6993 struct lpfc_vport *vport = phba->pport; in lpfc_destroy_shost()
7002 * lpfc_setup_bg - Setup Block guard structures and debug areas.
7016 if (phba->cfg_prot_mask && phba->cfg_prot_guard) { in lpfc_setup_bg()
7021 old_mask = phba->cfg_prot_mask; in lpfc_setup_bg()
7022 old_guard = phba->cfg_prot_guard; in lpfc_setup_bg()
7025 phba->cfg_prot_mask &= (SHOST_DIF_TYPE1_PROTECTION | in lpfc_setup_bg()
7028 phba->cfg_prot_guard &= (SHOST_DIX_GUARD_IP | in lpfc_setup_bg()
7032 if (phba->cfg_prot_mask == SHOST_DIX_TYPE1_PROTECTION) in lpfc_setup_bg()
7033 phba->cfg_prot_mask |= SHOST_DIF_TYPE1_PROTECTION; in lpfc_setup_bg()
7035 if (phba->cfg_prot_mask && phba->cfg_prot_guard) { in lpfc_setup_bg()
7036 if ((old_mask != phba->cfg_prot_mask) || in lpfc_setup_bg()
7037 (old_guard != phba->cfg_prot_guard)) in lpfc_setup_bg()
7041 phba->cfg_prot_mask, in lpfc_setup_bg()
7042 phba->cfg_prot_guard); in lpfc_setup_bg()
7044 scsi_host_set_prot(shost, phba->cfg_prot_mask); in lpfc_setup_bg()
7045 scsi_host_set_guard(shost, phba->cfg_prot_guard); in lpfc_setup_bg()
7068 --pagecnt; in lpfc_setup_bg()
7092 --pagecnt; in lpfc_setup_bg()
7105 * lpfc_post_init_setup - Perform necessary device post initialization setup.
7118 lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); in lpfc_post_init_setup()
7124 shost = pci_get_drvdata(phba->pcidev); in lpfc_post_init_setup()
7125 shost->can_queue = phba->cfg_hba_queue_depth - 10; in lpfc_post_init_setup()
7126 if (phba->sli3_options & LPFC_SLI3_BG_ENABLED) in lpfc_post_init_setup()
7131 if (phba->cfg_poll & DISABLE_FCP_RING_INT) { in lpfc_post_init_setup()
7132 spin_lock_irq(shost->host_lock); in lpfc_post_init_setup()
7134 spin_unlock_irq(shost->host_lock); in lpfc_post_init_setup()
7150 * lpfc_sli_pci_mem_setup - Setup SLI3 HBA PCI memory space.
7154 * with SLI-3 interface spec.
7157 * 0 - successful
7158 * other values - error
7167 int error = -ENODEV; in lpfc_sli_pci_mem_setup()
7170 if (!phba->pcidev) in lpfc_sli_pci_mem_setup()
7173 pdev = phba->pcidev; in lpfc_sli_pci_mem_setup()
7187 phba->pci_bar0_map = pci_resource_start(pdev, 0); in lpfc_sli_pci_mem_setup()
7190 phba->pci_bar2_map = pci_resource_start(pdev, 2); in lpfc_sli_pci_mem_setup()
7194 phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len); in lpfc_sli_pci_mem_setup()
7195 if (!phba->slim_memmap_p) { in lpfc_sli_pci_mem_setup()
7196 dev_printk(KERN_ERR, &pdev->dev, in lpfc_sli_pci_mem_setup()
7202 phba->ctrl_regs_memmap_p = ioremap(phba->pci_bar2_map, bar2map_len); in lpfc_sli_pci_mem_setup()
7203 if (!phba->ctrl_regs_memmap_p) { in lpfc_sli_pci_mem_setup()
7204 dev_printk(KERN_ERR, &pdev->dev, in lpfc_sli_pci_mem_setup()
7209 /* Allocate memory for SLI-2 structures */ in lpfc_sli_pci_mem_setup()
7210 phba->slim2p.virt = dma_zalloc_coherent(&pdev->dev, SLI2_SLIM_SIZE, in lpfc_sli_pci_mem_setup()
7211 &phba->slim2p.phys, GFP_KERNEL); in lpfc_sli_pci_mem_setup()
7212 if (!phba->slim2p.virt) in lpfc_sli_pci_mem_setup()
7215 phba->mbox = phba->slim2p.virt + offsetof(struct lpfc_sli2_slim, mbx); in lpfc_sli_pci_mem_setup()
7216 phba->mbox_ext = (phba->slim2p.virt + in lpfc_sli_pci_mem_setup()
7218 phba->pcb = (phba->slim2p.virt + offsetof(struct lpfc_sli2_slim, pcb)); in lpfc_sli_pci_mem_setup()
7219 phba->IOCBs = (phba->slim2p.virt + in lpfc_sli_pci_mem_setup()
7222 phba->hbqslimp.virt = dma_alloc_coherent(&pdev->dev, in lpfc_sli_pci_mem_setup()
7224 &phba->hbqslimp.phys, in lpfc_sli_pci_mem_setup()
7226 if (!phba->hbqslimp.virt) in lpfc_sli_pci_mem_setup()
7230 ptr = phba->hbqslimp.virt; in lpfc_sli_pci_mem_setup()
7232 phba->hbqs[i].hbq_virt = ptr; in lpfc_sli_pci_mem_setup()
7233 INIT_LIST_HEAD(&phba->hbqs[i].hbq_buffer_list); in lpfc_sli_pci_mem_setup()
7234 ptr += (lpfc_hbq_defs[i]->entry_count * in lpfc_sli_pci_mem_setup()
7237 phba->hbqs[LPFC_ELS_HBQ].hbq_alloc_buffer = lpfc_els_hbq_alloc; in lpfc_sli_pci_mem_setup()
7238 phba->hbqs[LPFC_ELS_HBQ].hbq_free_buffer = lpfc_els_hbq_free; in lpfc_sli_pci_mem_setup()
7240 memset(phba->hbqslimp.virt, 0, lpfc_sli_hbq_size()); in lpfc_sli_pci_mem_setup()
7242 phba->MBslimaddr = phba->slim_memmap_p; in lpfc_sli_pci_mem_setup()
7243 phba->HAregaddr = phba->ctrl_regs_memmap_p + HA_REG_OFFSET; in lpfc_sli_pci_mem_setup()
7244 phba->CAregaddr = phba->ctrl_regs_memmap_p + CA_REG_OFFSET; in lpfc_sli_pci_mem_setup()
7245 phba->HSregaddr = phba->ctrl_regs_memmap_p + HS_REG_OFFSET; in lpfc_sli_pci_mem_setup()
7246 phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET; in lpfc_sli_pci_mem_setup()
7251 dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, in lpfc_sli_pci_mem_setup()
7252 phba->slim2p.virt, phba->slim2p.phys); in lpfc_sli_pci_mem_setup()
7254 iounmap(phba->ctrl_regs_memmap_p); in lpfc_sli_pci_mem_setup()
7256 iounmap(phba->slim_memmap_p); in lpfc_sli_pci_mem_setup()
7262 * lpfc_sli_pci_mem_unset - Unset SLI3 HBA PCI memory space.
7266 * with SLI-3 interface spec.
7274 if (!phba->pcidev) in lpfc_sli_pci_mem_unset()
7277 pdev = phba->pcidev; in lpfc_sli_pci_mem_unset()
7280 dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), in lpfc_sli_pci_mem_unset()
7281 phba->hbqslimp.virt, phba->hbqslimp.phys); in lpfc_sli_pci_mem_unset()
7282 dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, in lpfc_sli_pci_mem_unset()
7283 phba->slim2p.virt, phba->slim2p.phys); in lpfc_sli_pci_mem_unset()
7286 iounmap(phba->ctrl_regs_memmap_p); in lpfc_sli_pci_mem_unset()
7287 iounmap(phba->slim_memmap_p); in lpfc_sli_pci_mem_unset()
7293 * lpfc_sli4_post_status_check - Wait for SLI4 POST done and check status
7299 * Return 0 if successful, otherwise -ENODEV.
7311 if (!phba->sli4_hba.PSMPHRregaddr) in lpfc_sli4_post_status_check()
7312 return -ENODEV; in lpfc_sli4_post_status_check()
7316 if (lpfc_readl(phba->sli4_hba.PSMPHRregaddr, in lpfc_sli4_post_status_check()
7320 port_error = -ENODEV; in lpfc_sli4_post_status_check()
7335 "1408 Port Failed POST - portsmphr=0x%x, " in lpfc_sli4_post_status_check()
7353 &phba->sli4_hba.sli_intf), in lpfc_sli4_post_status_check()
7355 &phba->sli4_hba.sli_intf), in lpfc_sli4_post_status_check()
7357 &phba->sli4_hba.sli_intf), in lpfc_sli4_post_status_check()
7359 &phba->sli4_hba.sli_intf), in lpfc_sli4_post_status_check()
7361 &phba->sli4_hba.sli_intf), in lpfc_sli4_post_status_check()
7363 &phba->sli4_hba.sli_intf)); in lpfc_sli4_post_status_check()
7370 &phba->sli4_hba.sli_intf); in lpfc_sli4_post_status_check()
7373 phba->sli4_hba.ue_mask_lo = in lpfc_sli4_post_status_check()
7374 readl(phba->sli4_hba.u.if_type0.UEMASKLOregaddr); in lpfc_sli4_post_status_check()
7375 phba->sli4_hba.ue_mask_hi = in lpfc_sli4_post_status_check()
7376 readl(phba->sli4_hba.u.if_type0.UEMASKHIregaddr); in lpfc_sli4_post_status_check()
7378 readl(phba->sli4_hba.u.if_type0.UERRLOregaddr); in lpfc_sli4_post_status_check()
7380 readl(phba->sli4_hba.u.if_type0.UERRHIregaddr); in lpfc_sli4_post_status_check()
7381 if ((~phba->sli4_hba.ue_mask_lo & uerrlo_reg.word0) || in lpfc_sli4_post_status_check()
7382 (~phba->sli4_hba.ue_mask_hi & uerrhi_reg.word0)) { in lpfc_sli4_post_status_check()
7392 phba->sli4_hba.ue_mask_lo, in lpfc_sli4_post_status_check()
7393 phba->sli4_hba.ue_mask_hi); in lpfc_sli4_post_status_check()
7394 port_error = -ENODEV; in lpfc_sli4_post_status_check()
7400 if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, in lpfc_sli4_post_status_check()
7404 phba->work_status[0] = in lpfc_sli4_post_status_check()
7405 readl(phba->sli4_hba.u.if_type2. in lpfc_sli4_post_status_check()
7407 phba->work_status[1] = in lpfc_sli4_post_status_check()
7408 readl(phba->sli4_hba.u.if_type2. in lpfc_sli4_post_status_check()
7417 phba->work_status[0], in lpfc_sli4_post_status_check()
7418 phba->work_status[1]); in lpfc_sli4_post_status_check()
7419 port_error = -ENODEV; in lpfc_sli4_post_status_check()
7431 * lpfc_sli4_bar0_register_memmap - Set up SLI4 BAR0 register memory map.
7443 phba->sli4_hba.u.if_type0.UERRLOregaddr = in lpfc_sli4_bar0_register_memmap()
7444 phba->sli4_hba.conf_regs_memmap_p + LPFC_UERR_STATUS_LO; in lpfc_sli4_bar0_register_memmap()
7445 phba->sli4_hba.u.if_type0.UERRHIregaddr = in lpfc_sli4_bar0_register_memmap()
7446 phba->sli4_hba.conf_regs_memmap_p + LPFC_UERR_STATUS_HI; in lpfc_sli4_bar0_register_memmap()
7447 phba->sli4_hba.u.if_type0.UEMASKLOregaddr = in lpfc_sli4_bar0_register_memmap()
7448 phba->sli4_hba.conf_regs_memmap_p + LPFC_UE_MASK_LO; in lpfc_sli4_bar0_register_memmap()
7449 phba->sli4_hba.u.if_type0.UEMASKHIregaddr = in lpfc_sli4_bar0_register_memmap()
7450 phba->sli4_hba.conf_regs_memmap_p + LPFC_UE_MASK_HI; in lpfc_sli4_bar0_register_memmap()
7451 phba->sli4_hba.SLIINTFregaddr = in lpfc_sli4_bar0_register_memmap()
7452 phba->sli4_hba.conf_regs_memmap_p + LPFC_SLI_INTF; in lpfc_sli4_bar0_register_memmap()
7455 phba->sli4_hba.u.if_type2.EQDregaddr = in lpfc_sli4_bar0_register_memmap()
7456 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7458 phba->sli4_hba.u.if_type2.ERR1regaddr = in lpfc_sli4_bar0_register_memmap()
7459 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7461 phba->sli4_hba.u.if_type2.ERR2regaddr = in lpfc_sli4_bar0_register_memmap()
7462 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7464 phba->sli4_hba.u.if_type2.CTRLregaddr = in lpfc_sli4_bar0_register_memmap()
7465 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7467 phba->sli4_hba.u.if_type2.STATUSregaddr = in lpfc_sli4_bar0_register_memmap()
7468 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7470 phba->sli4_hba.SLIINTFregaddr = in lpfc_sli4_bar0_register_memmap()
7471 phba->sli4_hba.conf_regs_memmap_p + LPFC_SLI_INTF; in lpfc_sli4_bar0_register_memmap()
7472 phba->sli4_hba.PSMPHRregaddr = in lpfc_sli4_bar0_register_memmap()
7473 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7475 phba->sli4_hba.RQDBregaddr = in lpfc_sli4_bar0_register_memmap()
7476 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7478 phba->sli4_hba.WQDBregaddr = in lpfc_sli4_bar0_register_memmap()
7479 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7481 phba->sli4_hba.CQDBregaddr = in lpfc_sli4_bar0_register_memmap()
7482 phba->sli4_hba.conf_regs_memmap_p + LPFC_EQCQ_DOORBELL; in lpfc_sli4_bar0_register_memmap()
7483 phba->sli4_hba.EQDBregaddr = phba->sli4_hba.CQDBregaddr; in lpfc_sli4_bar0_register_memmap()
7484 phba->sli4_hba.MQDBregaddr = in lpfc_sli4_bar0_register_memmap()
7485 phba->sli4_hba.conf_regs_memmap_p + LPFC_MQ_DOORBELL; in lpfc_sli4_bar0_register_memmap()
7486 phba->sli4_hba.BMBXregaddr = in lpfc_sli4_bar0_register_memmap()
7487 phba->sli4_hba.conf_regs_memmap_p + LPFC_BMBX; in lpfc_sli4_bar0_register_memmap()
7490 phba->sli4_hba.u.if_type2.EQDregaddr = in lpfc_sli4_bar0_register_memmap()
7491 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7493 phba->sli4_hba.u.if_type2.ERR1regaddr = in lpfc_sli4_bar0_register_memmap()
7494 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7496 phba->sli4_hba.u.if_type2.ERR2regaddr = in lpfc_sli4_bar0_register_memmap()
7497 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7499 phba->sli4_hba.u.if_type2.CTRLregaddr = in lpfc_sli4_bar0_register_memmap()
7500 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7502 phba->sli4_hba.u.if_type2.STATUSregaddr = in lpfc_sli4_bar0_register_memmap()
7503 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7505 phba->sli4_hba.PSMPHRregaddr = in lpfc_sli4_bar0_register_memmap()
7506 phba->sli4_hba.conf_regs_memmap_p + in lpfc_sli4_bar0_register_memmap()
7508 phba->sli4_hba.BMBXregaddr = in lpfc_sli4_bar0_register_memmap()
7509 phba->sli4_hba.conf_regs_memmap_p + LPFC_BMBX; in lpfc_sli4_bar0_register_memmap()
7513 dev_printk(KERN_ERR, &phba->pcidev->dev, in lpfc_sli4_bar0_register_memmap()
7514 "FATAL - unsupported SLI4 interface type - %d\n", in lpfc_sli4_bar0_register_memmap()
7521 * lpfc_sli4_bar1_register_memmap - Set up SLI4 BAR1 register memory map.
7531 phba->sli4_hba.PSMPHRregaddr = in lpfc_sli4_bar1_register_memmap()
7532 phba->sli4_hba.ctrl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7534 phba->sli4_hba.ISRregaddr = phba->sli4_hba.ctrl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7536 phba->sli4_hba.IMRregaddr = phba->sli4_hba.ctrl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7538 phba->sli4_hba.ISCRregaddr = phba->sli4_hba.ctrl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7542 phba->sli4_hba.RQDBregaddr = phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7544 phba->sli4_hba.WQDBregaddr = phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7546 phba->sli4_hba.CQDBregaddr = phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7548 phba->sli4_hba.EQDBregaddr = phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7550 phba->sli4_hba.MQDBregaddr = phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar1_register_memmap()
7556 dev_err(&phba->pcidev->dev, in lpfc_sli4_bar1_register_memmap()
7557 "FATAL - unsupported SLI4 interface type - %d\n", in lpfc_sli4_bar1_register_memmap()
7564 * lpfc_sli4_bar2_register_memmap - Set up SLI4 BAR2 register memory map.
7571 * Return 0 if successful, otherwise -ENODEV.
7577 return -ENODEV; in lpfc_sli4_bar2_register_memmap()
7579 phba->sli4_hba.RQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar2_register_memmap()
7582 phba->sli4_hba.WQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar2_register_memmap()
7585 phba->sli4_hba.CQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar2_register_memmap()
7588 phba->sli4_hba.EQDBregaddr = phba->sli4_hba.CQDBregaddr; in lpfc_sli4_bar2_register_memmap()
7589 phba->sli4_hba.MQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar2_register_memmap()
7591 phba->sli4_hba.BMBXregaddr = (phba->sli4_hba.drbl_regs_memmap_p + in lpfc_sli4_bar2_register_memmap()
7597 * lpfc_create_bootstrap_mbox - Create the bootstrap mailbox
7601 * region consistent with the SLI-4 interface spec. This
7608 * 0 - successful
7609 * -ENOMEM - could not allocated memory.
7622 return -ENOMEM; in lpfc_create_bootstrap_mbox()
7628 bmbx_size = sizeof(struct lpfc_bmbx_create) + (LPFC_ALIGN_16_BYTE - 1); in lpfc_create_bootstrap_mbox()
7629 dmabuf->virt = dma_zalloc_coherent(&phba->pcidev->dev, bmbx_size, in lpfc_create_bootstrap_mbox()
7630 &dmabuf->phys, GFP_KERNEL); in lpfc_create_bootstrap_mbox()
7631 if (!dmabuf->virt) { in lpfc_create_bootstrap_mbox()
7633 return -ENOMEM; in lpfc_create_bootstrap_mbox()
7639 * to be 16-byte aligned. Also align the virtual memory as each in lpfc_create_bootstrap_mbox()
7643 phba->sli4_hba.bmbx.dmabuf = dmabuf; in lpfc_create_bootstrap_mbox()
7644 phba->sli4_hba.bmbx.bmbx_size = bmbx_size; in lpfc_create_bootstrap_mbox()
7646 phba->sli4_hba.bmbx.avirt = PTR_ALIGN(dmabuf->virt, in lpfc_create_bootstrap_mbox()
7648 phba->sli4_hba.bmbx.aphys = ALIGN(dmabuf->phys, in lpfc_create_bootstrap_mbox()
7654 * as two 30-bit addresses. The other data is a bit marking whether in lpfc_create_bootstrap_mbox()
7655 * the 30-bit address is the high or low address. in lpfc_create_bootstrap_mbox()
7659 dma_address = &phba->sli4_hba.bmbx.dma_address; in lpfc_create_bootstrap_mbox()
7660 phys_addr = (uint64_t)phba->sli4_hba.bmbx.aphys; in lpfc_create_bootstrap_mbox()
7662 dma_address->addr_hi = (uint32_t) ((pa_addr << 2) | in lpfc_create_bootstrap_mbox()
7665 pa_addr = (uint32_t) ((phba->sli4_hba.bmbx.aphys >> 4) & 0x3fffffff); in lpfc_create_bootstrap_mbox()
7666 dma_address->addr_lo = (uint32_t) ((pa_addr << 2) | in lpfc_create_bootstrap_mbox()
7672 * lpfc_destroy_bootstrap_mbox - Destroy all bootstrap mailbox resources
7685 dma_free_coherent(&phba->pcidev->dev, in lpfc_destroy_bootstrap_mbox()
7686 phba->sli4_hba.bmbx.bmbx_size, in lpfc_destroy_bootstrap_mbox()
7687 phba->sli4_hba.bmbx.dmabuf->virt, in lpfc_destroy_bootstrap_mbox()
7688 phba->sli4_hba.bmbx.dmabuf->phys); in lpfc_destroy_bootstrap_mbox()
7690 kfree(phba->sli4_hba.bmbx.dmabuf); in lpfc_destroy_bootstrap_mbox()
7691 memset(&phba->sli4_hba.bmbx, 0, sizeof(struct lpfc_bmbx)); in lpfc_destroy_bootstrap_mbox()
7695 * lpfc_sli4_read_config - Get the config parameters.
7704 * 0 - successful
7705 * -ENOMEM - No available memory
7706 * -EIO - The mailbox failed to complete successfully.
7722 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_read_config()
7727 return -ENOMEM; in lpfc_sli4_read_config()
7737 bf_get(lpfc_mqe_command, &pmb->u.mqe), in lpfc_sli4_read_config()
7738 bf_get(lpfc_mqe_status, &pmb->u.mqe)); in lpfc_sli4_read_config()
7739 rc = -EIO; in lpfc_sli4_read_config()
7741 rd_config = &pmb->u.mqe.un.rd_config; in lpfc_sli4_read_config()
7743 phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_VAL; in lpfc_sli4_read_config()
7744 phba->sli4_hba.lnk_info.lnk_tp = in lpfc_sli4_read_config()
7746 phba->sli4_hba.lnk_info.lnk_no = in lpfc_sli4_read_config()
7750 phba->sli4_hba.lnk_info.lnk_tp, in lpfc_sli4_read_config()
7751 phba->sli4_hba.lnk_info.lnk_no); in lpfc_sli4_read_config()
7755 bf_get(lpfc_mqe_command, &pmb->u.mqe)); in lpfc_sli4_read_config()
7757 phba->bbcredit_support = 1; in lpfc_sli4_read_config()
7758 phba->sli4_hba.bbscn_params.word0 = rd_config->word8; in lpfc_sli4_read_config()
7761 phba->sli4_hba.extents_in_use = in lpfc_sli4_read_config()
7763 phba->sli4_hba.max_cfg_param.max_xri = in lpfc_sli4_read_config()
7765 phba->sli4_hba.max_cfg_param.xri_base = in lpfc_sli4_read_config()
7767 phba->sli4_hba.max_cfg_param.max_vpi = in lpfc_sli4_read_config()
7770 if (phba->sli4_hba.max_cfg_param.max_vpi > LPFC_MAX_VPORTS) in lpfc_sli4_read_config()
7771 phba->sli4_hba.max_cfg_param.max_vpi = LPFC_MAX_VPORTS; in lpfc_sli4_read_config()
7772 phba->sli4_hba.max_cfg_param.vpi_base = in lpfc_sli4_read_config()
7774 phba->sli4_hba.max_cfg_param.max_rpi = in lpfc_sli4_read_config()
7776 phba->sli4_hba.max_cfg_param.rpi_base = in lpfc_sli4_read_config()
7778 phba->sli4_hba.max_cfg_param.max_vfi = in lpfc_sli4_read_config()
7780 phba->sli4_hba.max_cfg_param.vfi_base = in lpfc_sli4_read_config()
7782 phba->sli4_hba.max_cfg_param.max_fcfi = in lpfc_sli4_read_config()
7784 phba->sli4_hba.max_cfg_param.max_eq = in lpfc_sli4_read_config()
7786 phba->sli4_hba.max_cfg_param.max_rq = in lpfc_sli4_read_config()
7788 phba->sli4_hba.max_cfg_param.max_wq = in lpfc_sli4_read_config()
7790 phba->sli4_hba.max_cfg_param.max_cq = in lpfc_sli4_read_config()
7792 phba->lmt = bf_get(lpfc_mbx_rd_conf_lmt, rd_config); in lpfc_sli4_read_config()
7793 phba->sli4_hba.next_xri = phba->sli4_hba.max_cfg_param.xri_base; in lpfc_sli4_read_config()
7794 phba->vpi_base = phba->sli4_hba.max_cfg_param.vpi_base; in lpfc_sli4_read_config()
7795 phba->vfi_base = phba->sli4_hba.max_cfg_param.vfi_base; in lpfc_sli4_read_config()
7796 phba->max_vpi = (phba->sli4_hba.max_cfg_param.max_vpi > 0) ? in lpfc_sli4_read_config()
7797 (phba->sli4_hba.max_cfg_param.max_vpi - 1) : 0; in lpfc_sli4_read_config()
7798 phba->max_vports = phba->max_vpi; in lpfc_sli4_read_config()
7806 phba->sli4_hba.extents_in_use, in lpfc_sli4_read_config()
7807 phba->sli4_hba.max_cfg_param.xri_base, in lpfc_sli4_read_config()
7808 phba->sli4_hba.max_cfg_param.max_xri, in lpfc_sli4_read_config()
7809 phba->sli4_hba.max_cfg_param.vpi_base, in lpfc_sli4_read_config()
7810 phba->sli4_hba.max_cfg_param.max_vpi, in lpfc_sli4_read_config()
7811 phba->sli4_hba.max_cfg_param.vfi_base, in lpfc_sli4_read_config()
7812 phba->sli4_hba.max_cfg_param.max_vfi, in lpfc_sli4_read_config()
7813 phba->sli4_hba.max_cfg_param.rpi_base, in lpfc_sli4_read_config()
7814 phba->sli4_hba.max_cfg_param.max_rpi, in lpfc_sli4_read_config()
7815 phba->sli4_hba.max_cfg_param.max_fcfi, in lpfc_sli4_read_config()
7816 phba->sli4_hba.max_cfg_param.max_eq, in lpfc_sli4_read_config()
7817 phba->sli4_hba.max_cfg_param.max_cq, in lpfc_sli4_read_config()
7818 phba->sli4_hba.max_cfg_param.max_wq, in lpfc_sli4_read_config()
7819 phba->sli4_hba.max_cfg_param.max_rq); in lpfc_sli4_read_config()
7825 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_sli4_read_config()
7826 length = phba->sli4_hba.max_cfg_param.max_wq; in lpfc_sli4_read_config()
7827 if (phba->sli4_hba.max_cfg_param.max_cq < in lpfc_sli4_read_config()
7828 phba->sli4_hba.max_cfg_param.max_wq) in lpfc_sli4_read_config()
7829 length = phba->sli4_hba.max_cfg_param.max_cq; in lpfc_sli4_read_config()
7837 length -= 6; in lpfc_sli4_read_config()
7838 if (!phba->nvmet_support) in lpfc_sli4_read_config()
7839 length -= phba->cfg_fcp_io_channel; in lpfc_sli4_read_config()
7841 if (phba->cfg_nvme_io_channel > length) { in lpfc_sli4_read_config()
7847 phba->sli4_hba.max_cfg_param.max_wq, in lpfc_sli4_read_config()
7848 phba->sli4_hba.max_cfg_param.max_cq, in lpfc_sli4_read_config()
7849 phba->cfg_nvme_io_channel, in lpfc_sli4_read_config()
7850 phba->cfg_fcp_io_channel); in lpfc_sli4_read_config()
7852 phba->cfg_nvme_io_channel = length; in lpfc_sli4_read_config()
7861 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_read_config()
7866 phba->hba_flag |= HBA_FORCED_LINK_SPEED; in lpfc_sli4_read_config()
7870 phba->cfg_link_speed = in lpfc_sli4_read_config()
7874 phba->cfg_link_speed = in lpfc_sli4_read_config()
7878 phba->cfg_link_speed = in lpfc_sli4_read_config()
7882 phba->cfg_link_speed = in lpfc_sli4_read_config()
7886 phba->cfg_link_speed = in lpfc_sli4_read_config()
7890 phba->cfg_link_speed = in lpfc_sli4_read_config()
7894 phba->cfg_link_speed = in lpfc_sli4_read_config()
7898 phba->cfg_link_speed = in lpfc_sli4_read_config()
7902 phba->cfg_link_speed = in lpfc_sli4_read_config()
7910 phba->cfg_link_speed = in lpfc_sli4_read_config()
7917 length = phba->sli4_hba.max_cfg_param.max_xri - in lpfc_sli4_read_config()
7919 if (phba->cfg_hba_queue_depth > length) { in lpfc_sli4_read_config()
7922 phba->cfg_hba_queue_depth, length); in lpfc_sli4_read_config()
7923 phba->cfg_hba_queue_depth = length; in lpfc_sli4_read_config()
7926 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_sli4_read_config()
7931 length = (sizeof(struct lpfc_mbx_get_func_cfg) - in lpfc_sli4_read_config()
7939 &pmb->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_read_config()
7940 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_read_config()
7941 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_read_config()
7946 bf_get(lpfc_mqe_command, &pmb->u.mqe), in lpfc_sli4_read_config()
7947 bf_get(lpfc_mqe_status, &pmb->u.mqe)); in lpfc_sli4_read_config()
7952 get_func_cfg = &pmb->u.mqe.un.get_func_cfg; in lpfc_sli4_read_config()
7954 pdesc_0 = (char *)&get_func_cfg->func_cfg.desc[0]; in lpfc_sli4_read_config()
7966 phba->sli4_hba.iov.pf_number = in lpfc_sli4_read_config()
7968 phba->sli4_hba.iov.vf_number = in lpfc_sli4_read_config()
7977 "vf_number:%d\n", phba->sli4_hba.iov.pf_number, in lpfc_sli4_read_config()
7978 phba->sli4_hba.iov.vf_number); in lpfc_sli4_read_config()
7986 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_sli4_read_config()
7991 * lpfc_setup_endian_order - Write endian order to an SLI4 if_type 0 port.
7994 * This routine is invoked to setup the port-side endian order when
7999 * 0 - successful
8000 * -ENOMEM - No available memory
8001 * -EIO - The mailbox failed to complete successfully.
8011 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_setup_endian_order()
8014 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, in lpfc_setup_endian_order()
8021 return -ENOMEM; in lpfc_setup_endian_order()
8029 memcpy(&mboxq->u.mqe, &endian_mb_data, sizeof(endian_mb_data)); in lpfc_setup_endian_order()
8036 rc = -EIO; in lpfc_setup_endian_order()
8038 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_setup_endian_order()
8050 * lpfc_sli4_queue_verify - Verify and update EQ counts
8059 * 0 - successful
8060 * -ENOMEM - No available memory
8066 int fof_vectors = phba->cfg_fof ? 1 : 0; in lpfc_sli4_queue_verify()
8069 * Sanity check for configured queue parameters against the run-time in lpfc_sli4_queue_verify()
8074 io_channel = phba->io_channel_irqs; in lpfc_sli4_queue_verify()
8076 if (phba->sli4_hba.num_online_cpu < io_channel) { in lpfc_sli4_queue_verify()
8081 io_channel, phba->sli4_hba.num_online_cpu); in lpfc_sli4_queue_verify()
8082 io_channel = phba->sli4_hba.num_online_cpu; in lpfc_sli4_queue_verify()
8085 if (io_channel + fof_vectors > phba->sli4_hba.max_cfg_param.max_eq) { in lpfc_sli4_queue_verify()
8090 phba->sli4_hba.max_cfg_param.max_eq); in lpfc_sli4_queue_verify()
8091 io_channel = phba->sli4_hba.max_cfg_param.max_eq - fof_vectors; in lpfc_sli4_queue_verify()
8095 if (io_channel != phba->io_channel_irqs) in lpfc_sli4_queue_verify()
8096 phba->io_channel_irqs = io_channel; in lpfc_sli4_queue_verify()
8097 if (phba->cfg_fcp_io_channel > io_channel) in lpfc_sli4_queue_verify()
8098 phba->cfg_fcp_io_channel = io_channel; in lpfc_sli4_queue_verify()
8099 if (phba->cfg_nvme_io_channel > io_channel) in lpfc_sli4_queue_verify()
8100 phba->cfg_nvme_io_channel = io_channel; in lpfc_sli4_queue_verify()
8101 if (phba->nvmet_support) { in lpfc_sli4_queue_verify()
8102 if (phba->cfg_nvme_io_channel < phba->cfg_nvmet_mrq) in lpfc_sli4_queue_verify()
8103 phba->cfg_nvmet_mrq = phba->cfg_nvme_io_channel; in lpfc_sli4_queue_verify()
8105 if (phba->cfg_nvmet_mrq > LPFC_NVMET_MRQ_MAX) in lpfc_sli4_queue_verify()
8106 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_MAX; in lpfc_sli4_queue_verify()
8110 phba->io_channel_irqs, phba->cfg_fcp_io_channel, in lpfc_sli4_queue_verify()
8111 phba->cfg_nvme_io_channel, phba->cfg_nvmet_mrq); in lpfc_sli4_queue_verify()
8114 phba->sli4_hba.eq_esize = LPFC_EQE_SIZE_4B; in lpfc_sli4_queue_verify()
8115 phba->sli4_hba.eq_ecount = LPFC_EQE_DEF_COUNT; in lpfc_sli4_queue_verify()
8118 phba->sli4_hba.cq_esize = LPFC_CQE_SIZE; in lpfc_sli4_queue_verify()
8119 phba->sli4_hba.cq_ecount = LPFC_CQE_DEF_COUNT; in lpfc_sli4_queue_verify()
8129 phba->sli4_hba.cq_esize, in lpfc_alloc_nvme_wq_cq()
8133 "0508 Failed allocate fast-path NVME CQ (%d)\n", in lpfc_alloc_nvme_wq_cq()
8137 qdesc->qe_valid = 1; in lpfc_alloc_nvme_wq_cq()
8138 phba->sli4_hba.nvme_cq[wqidx] = qdesc; in lpfc_alloc_nvme_wq_cq()
8144 "0509 Failed allocate fast-path NVME WQ (%d)\n", in lpfc_alloc_nvme_wq_cq()
8148 phba->sli4_hba.nvme_wq[wqidx] = qdesc; in lpfc_alloc_nvme_wq_cq()
8149 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); in lpfc_alloc_nvme_wq_cq()
8160 if (phba->enab_exp_wqcq_pages) in lpfc_alloc_fcp_wq_cq()
8163 phba->sli4_hba.cq_esize, in lpfc_alloc_fcp_wq_cq()
8168 phba->sli4_hba.cq_esize, in lpfc_alloc_fcp_wq_cq()
8169 phba->sli4_hba.cq_ecount); in lpfc_alloc_fcp_wq_cq()
8172 "0499 Failed allocate fast-path FCP CQ (%d)\n", wqidx); in lpfc_alloc_fcp_wq_cq()
8175 qdesc->qe_valid = 1; in lpfc_alloc_fcp_wq_cq()
8176 phba->sli4_hba.fcp_cq[wqidx] = qdesc; in lpfc_alloc_fcp_wq_cq()
8179 if (phba->enab_exp_wqcq_pages) { in lpfc_alloc_fcp_wq_cq()
8181 wqesize = (phba->fcp_embed_io) ? in lpfc_alloc_fcp_wq_cq()
8182 LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize; in lpfc_alloc_fcp_wq_cq()
8188 phba->sli4_hba.wq_esize, in lpfc_alloc_fcp_wq_cq()
8189 phba->sli4_hba.wq_ecount); in lpfc_alloc_fcp_wq_cq()
8193 "0503 Failed allocate fast-path FCP WQ (%d)\n", in lpfc_alloc_fcp_wq_cq()
8197 phba->sli4_hba.fcp_wq[wqidx] = qdesc; in lpfc_alloc_fcp_wq_cq()
8198 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); in lpfc_alloc_fcp_wq_cq()
8203 * lpfc_sli4_queue_create - Create all the SLI4 queues
8212 * 0 - successful
8213 * -ENOMEM - No availble memory
8214 * -EIO - The mailbox failed to complete successfully.
8226 io_channel = phba->io_channel_irqs; in lpfc_sli4_queue_create()
8228 return -ERANGE; in lpfc_sli4_queue_create()
8230 phba->sli4_hba.mq_esize = LPFC_MQE_SIZE; in lpfc_sli4_queue_create()
8231 phba->sli4_hba.mq_ecount = LPFC_MQE_DEF_COUNT; in lpfc_sli4_queue_create()
8232 phba->sli4_hba.wq_esize = LPFC_WQE_SIZE; in lpfc_sli4_queue_create()
8233 phba->sli4_hba.wq_ecount = LPFC_WQE_DEF_COUNT; in lpfc_sli4_queue_create()
8234 phba->sli4_hba.rq_esize = LPFC_RQE_SIZE; in lpfc_sli4_queue_create()
8235 phba->sli4_hba.rq_ecount = LPFC_RQE_DEF_COUNT; in lpfc_sli4_queue_create()
8236 phba->sli4_hba.eq_esize = LPFC_EQE_SIZE_4B; in lpfc_sli4_queue_create()
8237 phba->sli4_hba.eq_ecount = LPFC_EQE_DEF_COUNT; in lpfc_sli4_queue_create()
8238 phba->sli4_hba.cq_esize = LPFC_CQE_SIZE; in lpfc_sli4_queue_create()
8239 phba->sli4_hba.cq_ecount = LPFC_CQE_DEF_COUNT; in lpfc_sli4_queue_create()
8241 phba->sli4_hba.hba_eq = kcalloc(io_channel, in lpfc_sli4_queue_create()
8244 if (!phba->sli4_hba.hba_eq) { in lpfc_sli4_queue_create()
8247 "fast-path EQ record array\n"); in lpfc_sli4_queue_create()
8251 if (phba->cfg_fcp_io_channel) { in lpfc_sli4_queue_create()
8252 phba->sli4_hba.fcp_cq = kcalloc(phba->cfg_fcp_io_channel, in lpfc_sli4_queue_create()
8255 if (!phba->sli4_hba.fcp_cq) { in lpfc_sli4_queue_create()
8258 "fast-path CQ record array\n"); in lpfc_sli4_queue_create()
8261 phba->sli4_hba.fcp_wq = kcalloc(phba->cfg_fcp_io_channel, in lpfc_sli4_queue_create()
8264 if (!phba->sli4_hba.fcp_wq) { in lpfc_sli4_queue_create()
8267 "fast-path FCP WQ record array\n"); in lpfc_sli4_queue_create()
8272 * this array is used to quickly see if we have a FCP fast-path in lpfc_sli4_queue_create()
8275 phba->sli4_hba.fcp_cq_map = kcalloc(phba->cfg_fcp_io_channel, in lpfc_sli4_queue_create()
8278 if (!phba->sli4_hba.fcp_cq_map) { in lpfc_sli4_queue_create()
8281 "fast-path CQ map\n"); in lpfc_sli4_queue_create()
8286 if (phba->cfg_nvme_io_channel) { in lpfc_sli4_queue_create()
8287 phba->sli4_hba.nvme_cq = kcalloc(phba->cfg_nvme_io_channel, in lpfc_sli4_queue_create()
8290 if (!phba->sli4_hba.nvme_cq) { in lpfc_sli4_queue_create()
8293 "fast-path CQ record array\n"); in lpfc_sli4_queue_create()
8297 phba->sli4_hba.nvme_wq = kcalloc(phba->cfg_nvme_io_channel, in lpfc_sli4_queue_create()
8300 if (!phba->sli4_hba.nvme_wq) { in lpfc_sli4_queue_create()
8303 "fast-path NVME WQ record array\n"); in lpfc_sli4_queue_create()
8309 * this array is used to quickly see if we have a NVME fast-path in lpfc_sli4_queue_create()
8312 phba->sli4_hba.nvme_cq_map = kcalloc(phba->cfg_nvme_io_channel, in lpfc_sli4_queue_create()
8315 if (!phba->sli4_hba.nvme_cq_map) { in lpfc_sli4_queue_create()
8318 "fast-path CQ map\n"); in lpfc_sli4_queue_create()
8322 if (phba->nvmet_support) { in lpfc_sli4_queue_create()
8323 phba->sli4_hba.nvmet_cqset = kcalloc( in lpfc_sli4_queue_create()
8324 phba->cfg_nvmet_mrq, in lpfc_sli4_queue_create()
8327 if (!phba->sli4_hba.nvmet_cqset) { in lpfc_sli4_queue_create()
8330 "fast-path CQ set array\n"); in lpfc_sli4_queue_create()
8333 phba->sli4_hba.nvmet_mrq_hdr = kcalloc( in lpfc_sli4_queue_create()
8334 phba->cfg_nvmet_mrq, in lpfc_sli4_queue_create()
8337 if (!phba->sli4_hba.nvmet_mrq_hdr) { in lpfc_sli4_queue_create()
8340 "fast-path RQ set hdr array\n"); in lpfc_sli4_queue_create()
8343 phba->sli4_hba.nvmet_mrq_data = kcalloc( in lpfc_sli4_queue_create()
8344 phba->cfg_nvmet_mrq, in lpfc_sli4_queue_create()
8347 if (!phba->sli4_hba.nvmet_mrq_data) { in lpfc_sli4_queue_create()
8350 "fast-path RQ set data array\n"); in lpfc_sli4_queue_create()
8356 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_wq_list); in lpfc_sli4_queue_create()
8362 phba->sli4_hba.eq_esize, in lpfc_sli4_queue_create()
8363 phba->sli4_hba.eq_ecount); in lpfc_sli4_queue_create()
8369 qdesc->qe_valid = 1; in lpfc_sli4_queue_create()
8370 phba->sli4_hba.hba_eq[idx] = qdesc; in lpfc_sli4_queue_create()
8375 for (idx = 0; idx < phba->cfg_fcp_io_channel; idx++) in lpfc_sli4_queue_create()
8379 for (idx = 0; idx < phba->cfg_nvme_io_channel; idx++) in lpfc_sli4_queue_create()
8383 if (phba->nvmet_support) { in lpfc_sli4_queue_create()
8384 for (idx = 0; idx < phba->cfg_nvmet_mrq; idx++) { in lpfc_sli4_queue_create()
8387 phba->sli4_hba.cq_esize, in lpfc_sli4_queue_create()
8388 phba->sli4_hba.cq_ecount); in lpfc_sli4_queue_create()
8395 qdesc->qe_valid = 1; in lpfc_sli4_queue_create()
8396 phba->sli4_hba.nvmet_cqset[idx] = qdesc; in lpfc_sli4_queue_create()
8404 /* Create slow-path Mailbox Command Complete Queue */ in lpfc_sli4_queue_create()
8406 phba->sli4_hba.cq_esize, in lpfc_sli4_queue_create()
8407 phba->sli4_hba.cq_ecount); in lpfc_sli4_queue_create()
8410 "0500 Failed allocate slow-path mailbox CQ\n"); in lpfc_sli4_queue_create()
8413 qdesc->qe_valid = 1; in lpfc_sli4_queue_create()
8414 phba->sli4_hba.mbx_cq = qdesc; in lpfc_sli4_queue_create()
8416 /* Create slow-path ELS Complete Queue */ in lpfc_sli4_queue_create()
8418 phba->sli4_hba.cq_esize, in lpfc_sli4_queue_create()
8419 phba->sli4_hba.cq_ecount); in lpfc_sli4_queue_create()
8422 "0501 Failed allocate slow-path ELS CQ\n"); in lpfc_sli4_queue_create()
8425 qdesc->qe_valid = 1; in lpfc_sli4_queue_create()
8426 phba->sli4_hba.els_cq = qdesc; in lpfc_sli4_queue_create()
8436 phba->sli4_hba.mq_esize, in lpfc_sli4_queue_create()
8437 phba->sli4_hba.mq_ecount); in lpfc_sli4_queue_create()
8440 "0505 Failed allocate slow-path MQ\n"); in lpfc_sli4_queue_create()
8443 phba->sli4_hba.mbx_wq = qdesc; in lpfc_sli4_queue_create()
8449 /* Create slow-path ELS Work Queue */ in lpfc_sli4_queue_create()
8451 phba->sli4_hba.wq_esize, in lpfc_sli4_queue_create()
8452 phba->sli4_hba.wq_ecount); in lpfc_sli4_queue_create()
8455 "0504 Failed allocate slow-path ELS WQ\n"); in lpfc_sli4_queue_create()
8458 phba->sli4_hba.els_wq = qdesc; in lpfc_sli4_queue_create()
8459 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); in lpfc_sli4_queue_create()
8461 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_sli4_queue_create()
8464 phba->sli4_hba.cq_esize, in lpfc_sli4_queue_create()
8465 phba->sli4_hba.cq_ecount); in lpfc_sli4_queue_create()
8471 qdesc->qe_valid = 1; in lpfc_sli4_queue_create()
8472 phba->sli4_hba.nvmels_cq = qdesc; in lpfc_sli4_queue_create()
8476 phba->sli4_hba.wq_esize, in lpfc_sli4_queue_create()
8477 phba->sli4_hba.wq_ecount); in lpfc_sli4_queue_create()
8483 phba->sli4_hba.nvmels_wq = qdesc; in lpfc_sli4_queue_create()
8484 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); in lpfc_sli4_queue_create()
8493 phba->sli4_hba.rq_esize, in lpfc_sli4_queue_create()
8494 phba->sli4_hba.rq_ecount); in lpfc_sli4_queue_create()
8500 phba->sli4_hba.hdr_rq = qdesc; in lpfc_sli4_queue_create()
8504 phba->sli4_hba.rq_esize, in lpfc_sli4_queue_create()
8505 phba->sli4_hba.rq_ecount); in lpfc_sli4_queue_create()
8511 phba->sli4_hba.dat_rq = qdesc; in lpfc_sli4_queue_create()
8513 if (phba->nvmet_support) { in lpfc_sli4_queue_create()
8514 for (idx = 0; idx < phba->cfg_nvmet_mrq; idx++) { in lpfc_sli4_queue_create()
8518 phba->sli4_hba.rq_esize, in lpfc_sli4_queue_create()
8526 phba->sli4_hba.nvmet_mrq_hdr[idx] = qdesc; in lpfc_sli4_queue_create()
8529 qdesc->rqbp = kzalloc(sizeof(struct lpfc_rqb), in lpfc_sli4_queue_create()
8531 if (qdesc->rqbp == NULL) { in lpfc_sli4_queue_create()
8539 INIT_LIST_HEAD(&qdesc->rqbp->rqb_buffer_list); in lpfc_sli4_queue_create()
8544 phba->sli4_hba.rq_esize, in lpfc_sli4_queue_create()
8552 phba->sli4_hba.nvmet_mrq_data[idx] = qdesc; in lpfc_sli4_queue_create()
8557 if (phba->cfg_fof) in lpfc_sli4_queue_create()
8563 return -ENOMEM; in lpfc_sli4_queue_create()
8600 * lpfc_sli4_queue_destroy - Destroy all the SLI4 queues
8607 * 0 - successful
8608 * -ENOMEM - No available memory
8609 * -EIO - The mailbox failed to complete successfully.
8614 if (phba->cfg_fof) in lpfc_sli4_queue_destroy()
8618 lpfc_sli4_release_queues(&phba->sli4_hba.hba_eq, phba->io_channel_irqs); in lpfc_sli4_queue_destroy()
8621 lpfc_sli4_release_queues(&phba->sli4_hba.fcp_cq, in lpfc_sli4_queue_destroy()
8622 phba->cfg_fcp_io_channel); in lpfc_sli4_queue_destroy()
8625 lpfc_sli4_release_queues(&phba->sli4_hba.fcp_wq, in lpfc_sli4_queue_destroy()
8626 phba->cfg_fcp_io_channel); in lpfc_sli4_queue_destroy()
8629 lpfc_sli4_release_queue_map(&phba->sli4_hba.fcp_cq_map); in lpfc_sli4_queue_destroy()
8632 lpfc_sli4_release_queues(&phba->sli4_hba.nvme_cq, in lpfc_sli4_queue_destroy()
8633 phba->cfg_nvme_io_channel); in lpfc_sli4_queue_destroy()
8636 lpfc_sli4_release_queues(&phba->sli4_hba.nvme_wq, in lpfc_sli4_queue_destroy()
8637 phba->cfg_nvme_io_channel); in lpfc_sli4_queue_destroy()
8640 lpfc_sli4_release_queue_map(&phba->sli4_hba.nvme_cq_map); in lpfc_sli4_queue_destroy()
8642 if (phba->nvmet_support) { in lpfc_sli4_queue_destroy()
8643 lpfc_sli4_release_queues(&phba->sli4_hba.nvmet_cqset, in lpfc_sli4_queue_destroy()
8644 phba->cfg_nvmet_mrq); in lpfc_sli4_queue_destroy()
8646 lpfc_sli4_release_queues(&phba->sli4_hba.nvmet_mrq_hdr, in lpfc_sli4_queue_destroy()
8647 phba->cfg_nvmet_mrq); in lpfc_sli4_queue_destroy()
8648 lpfc_sli4_release_queues(&phba->sli4_hba.nvmet_mrq_data, in lpfc_sli4_queue_destroy()
8649 phba->cfg_nvmet_mrq); in lpfc_sli4_queue_destroy()
8653 __lpfc_sli4_release_queue(&phba->sli4_hba.mbx_wq); in lpfc_sli4_queue_destroy()
8656 __lpfc_sli4_release_queue(&phba->sli4_hba.els_wq); in lpfc_sli4_queue_destroy()
8659 __lpfc_sli4_release_queue(&phba->sli4_hba.nvmels_wq); in lpfc_sli4_queue_destroy()
8662 __lpfc_sli4_release_queue(&phba->sli4_hba.hdr_rq); in lpfc_sli4_queue_destroy()
8663 __lpfc_sli4_release_queue(&phba->sli4_hba.dat_rq); in lpfc_sli4_queue_destroy()
8666 __lpfc_sli4_release_queue(&phba->sli4_hba.els_cq); in lpfc_sli4_queue_destroy()
8669 __lpfc_sli4_release_queue(&phba->sli4_hba.nvmels_cq); in lpfc_sli4_queue_destroy()
8672 __lpfc_sli4_release_queue(&phba->sli4_hba.mbx_cq); in lpfc_sli4_queue_destroy()
8675 INIT_LIST_HEAD(&phba->sli4_hba.lpfc_wq_list); in lpfc_sli4_queue_destroy()
8685 rqbp = rq->rqbp; in lpfc_free_rq_buffer()
8686 while (!list_empty(&rqbp->rqb_buffer_list)) { in lpfc_free_rq_buffer()
8687 list_remove_head(&rqbp->rqb_buffer_list, h_buf, in lpfc_free_rq_buffer()
8691 (rqbp->rqb_free_buffer)(phba, rqb_buffer); in lpfc_free_rq_buffer()
8692 rqbp->buffer_count--; in lpfc_free_rq_buffer()
8707 "6085 Fast-path %s (%d) not allocated\n", in lpfc_create_wq_cq()
8709 return -ENOMEM; in lpfc_create_wq_cq()
8721 cq->chann = qidx; in lpfc_create_wq_cq()
8726 *cq_map = cq->queue_id; in lpfc_create_wq_cq()
8729 "6087 CQ setup: cq[%d]-id=%d, parent eq[%d]-id=%d\n", in lpfc_create_wq_cq()
8730 qidx, cq->queue_id, qidx, eq->queue_id); in lpfc_create_wq_cq()
8738 /* no need to tear down cq - caller will do so */ in lpfc_create_wq_cq()
8741 wq->chann = qidx; in lpfc_create_wq_cq()
8744 pring = wq->pring; in lpfc_create_wq_cq()
8745 pring->sli.sli4.wqp = (void *)wq; in lpfc_create_wq_cq()
8746 cq->pring = pring; in lpfc_create_wq_cq()
8749 "2593 WQ setup: wq[%d]-id=%d assoc=%d, cq[%d]-id=%d\n", in lpfc_create_wq_cq()
8750 qidx, wq->queue_id, wq->assoc_qid, qidx, cq->queue_id); in lpfc_create_wq_cq()
8755 "0539 Failed setup of slow-path MQ: " in lpfc_create_wq_cq()
8757 /* no need to tear down cq - caller will do so */ in lpfc_create_wq_cq()
8762 "2589 MBX MQ setup: wq-id=%d, parent cq-id=%d\n", in lpfc_create_wq_cq()
8763 phba->sli4_hba.mbx_wq->queue_id, in lpfc_create_wq_cq()
8764 phba->sli4_hba.mbx_cq->queue_id); in lpfc_create_wq_cq()
8771 * lpfc_sli4_queue_setup - Set up all the SLI4 queues
8778 * 0 - successful
8779 * -ENOMEM - No available memory
8780 * -EIO - The mailbox failed to complete successfully.
8790 int rc = -ENOMEM; in lpfc_sli4_queue_setup()
8792 /* Check for dual-ULP support */ in lpfc_sli4_queue_setup()
8793 mboxq = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_queue_setup()
8798 return -ENOMEM; in lpfc_sli4_queue_setup()
8800 length = (sizeof(struct lpfc_mbx_query_fw_config) - in lpfc_sli4_queue_setup()
8809 &mboxq->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_queue_setup()
8810 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_queue_setup()
8811 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_queue_setup()
8818 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_queue_setup()
8819 rc = -ENXIO; in lpfc_sli4_queue_setup()
8823 phba->sli4_hba.fw_func_mode = in lpfc_sli4_queue_setup()
8824 mboxq->u.mqe.un.query_fw_cfg.rsp.function_mode; in lpfc_sli4_queue_setup()
8825 phba->sli4_hba.ulp0_mode = mboxq->u.mqe.un.query_fw_cfg.rsp.ulp0_mode; in lpfc_sli4_queue_setup()
8826 phba->sli4_hba.ulp1_mode = mboxq->u.mqe.un.query_fw_cfg.rsp.ulp1_mode; in lpfc_sli4_queue_setup()
8827 phba->sli4_hba.physical_port = in lpfc_sli4_queue_setup()
8828 mboxq->u.mqe.un.query_fw_cfg.rsp.physical_port; in lpfc_sli4_queue_setup()
8831 "ulp1_mode:x%x\n", phba->sli4_hba.fw_func_mode, in lpfc_sli4_queue_setup()
8832 phba->sli4_hba.ulp0_mode, phba->sli4_hba.ulp1_mode); in lpfc_sli4_queue_setup()
8835 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_sli4_queue_setup()
8840 io_channel = phba->io_channel_irqs; in lpfc_sli4_queue_setup()
8843 if (io_channel && !phba->sli4_hba.hba_eq) { in lpfc_sli4_queue_setup()
8845 "3147 Fast-path EQs not allocated\n"); in lpfc_sli4_queue_setup()
8846 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8850 if (!phba->sli4_hba.hba_eq[qidx]) { in lpfc_sli4_queue_setup()
8852 "0522 Fast-path EQ (%d) not " in lpfc_sli4_queue_setup()
8854 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8857 rc = lpfc_eq_create(phba, phba->sli4_hba.hba_eq[qidx], in lpfc_sli4_queue_setup()
8858 phba->cfg_fcp_imax); in lpfc_sli4_queue_setup()
8861 "0523 Failed setup of fast-path EQ " in lpfc_sli4_queue_setup()
8867 "2584 HBA EQ setup: queue[%d]-id=%d\n", in lpfc_sli4_queue_setup()
8868 qidx, phba->sli4_hba.hba_eq[qidx]->queue_id); in lpfc_sli4_queue_setup()
8871 if (phba->cfg_nvme_io_channel) { in lpfc_sli4_queue_setup()
8872 if (!phba->sli4_hba.nvme_cq || !phba->sli4_hba.nvme_wq) { in lpfc_sli4_queue_setup()
8874 "6084 Fast-path NVME %s array not allocated\n", in lpfc_sli4_queue_setup()
8875 (phba->sli4_hba.nvme_cq) ? "CQ" : "WQ"); in lpfc_sli4_queue_setup()
8876 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8880 for (qidx = 0; qidx < phba->cfg_nvme_io_channel; qidx++) { in lpfc_sli4_queue_setup()
8882 phba->sli4_hba.hba_eq[ in lpfc_sli4_queue_setup()
8884 phba->sli4_hba.nvme_cq[qidx], in lpfc_sli4_queue_setup()
8885 phba->sli4_hba.nvme_wq[qidx], in lpfc_sli4_queue_setup()
8886 &phba->sli4_hba.nvme_cq_map[qidx], in lpfc_sli4_queue_setup()
8898 if (phba->cfg_fcp_io_channel) { in lpfc_sli4_queue_setup()
8899 /* Set up fast-path FCP Response Complete Queue */ in lpfc_sli4_queue_setup()
8900 if (!phba->sli4_hba.fcp_cq || !phba->sli4_hba.fcp_wq) { in lpfc_sli4_queue_setup()
8902 "3148 Fast-path FCP %s array not allocated\n", in lpfc_sli4_queue_setup()
8903 phba->sli4_hba.fcp_cq ? "WQ" : "CQ"); in lpfc_sli4_queue_setup()
8904 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8908 for (qidx = 0; qidx < phba->cfg_fcp_io_channel; qidx++) { in lpfc_sli4_queue_setup()
8910 phba->sli4_hba.hba_eq[ in lpfc_sli4_queue_setup()
8912 phba->sli4_hba.fcp_cq[qidx], in lpfc_sli4_queue_setup()
8913 phba->sli4_hba.fcp_wq[qidx], in lpfc_sli4_queue_setup()
8914 &phba->sli4_hba.fcp_cq_map[qidx], in lpfc_sli4_queue_setup()
8930 /* Set up slow-path MBOX CQ/MQ */ in lpfc_sli4_queue_setup()
8932 if (!phba->sli4_hba.mbx_cq || !phba->sli4_hba.mbx_wq) { in lpfc_sli4_queue_setup()
8935 phba->sli4_hba.mbx_cq ? in lpfc_sli4_queue_setup()
8937 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8941 rc = lpfc_create_wq_cq(phba, phba->sli4_hba.hba_eq[0], in lpfc_sli4_queue_setup()
8942 phba->sli4_hba.mbx_cq, in lpfc_sli4_queue_setup()
8943 phba->sli4_hba.mbx_wq, in lpfc_sli4_queue_setup()
8951 if (phba->nvmet_support) { in lpfc_sli4_queue_setup()
8952 if (!phba->sli4_hba.nvmet_cqset) { in lpfc_sli4_queue_setup()
8954 "3165 Fast-path NVME CQ Set " in lpfc_sli4_queue_setup()
8956 rc = -ENOMEM; in lpfc_sli4_queue_setup()
8959 if (phba->cfg_nvmet_mrq > 1) { in lpfc_sli4_queue_setup()
8961 phba->sli4_hba.nvmet_cqset, in lpfc_sli4_queue_setup()
8962 phba->sli4_hba.hba_eq, in lpfc_sli4_queue_setup()
8973 rc = lpfc_cq_create(phba, phba->sli4_hba.nvmet_cqset[0], in lpfc_sli4_queue_setup()
8974 phba->sli4_hba.hba_eq[0], in lpfc_sli4_queue_setup()
8982 phba->sli4_hba.nvmet_cqset[0]->chann = 0; in lpfc_sli4_queue_setup()
8985 "6090 NVMET CQ setup: cq-id=%d, " in lpfc_sli4_queue_setup()
8986 "parent eq-id=%d\n", in lpfc_sli4_queue_setup()
8987 phba->sli4_hba.nvmet_cqset[0]->queue_id, in lpfc_sli4_queue_setup()
8988 phba->sli4_hba.hba_eq[0]->queue_id); in lpfc_sli4_queue_setup()
8992 /* Set up slow-path ELS WQ/CQ */ in lpfc_sli4_queue_setup()
8993 if (!phba->sli4_hba.els_cq || !phba->sli4_hba.els_wq) { in lpfc_sli4_queue_setup()
8996 phba->sli4_hba.els_cq ? "WQ" : "CQ"); in lpfc_sli4_queue_setup()
8997 rc = -ENOMEM; in lpfc_sli4_queue_setup()
9000 rc = lpfc_create_wq_cq(phba, phba->sli4_hba.hba_eq[0], in lpfc_sli4_queue_setup()
9001 phba->sli4_hba.els_cq, in lpfc_sli4_queue_setup()
9002 phba->sli4_hba.els_wq, in lpfc_sli4_queue_setup()
9011 "2590 ELS WQ setup: wq-id=%d, parent cq-id=%d\n", in lpfc_sli4_queue_setup()
9012 phba->sli4_hba.els_wq->queue_id, in lpfc_sli4_queue_setup()
9013 phba->sli4_hba.els_cq->queue_id); in lpfc_sli4_queue_setup()
9015 if (phba->cfg_nvme_io_channel) { in lpfc_sli4_queue_setup()
9017 if (!phba->sli4_hba.nvmels_cq || !phba->sli4_hba.nvmels_wq) { in lpfc_sli4_queue_setup()
9020 phba->sli4_hba.nvmels_cq ? "WQ" : "CQ"); in lpfc_sli4_queue_setup()
9021 rc = -ENOMEM; in lpfc_sli4_queue_setup()
9024 rc = lpfc_create_wq_cq(phba, phba->sli4_hba.hba_eq[0], in lpfc_sli4_queue_setup()
9025 phba->sli4_hba.nvmels_cq, in lpfc_sli4_queue_setup()
9026 phba->sli4_hba.nvmels_wq, in lpfc_sli4_queue_setup()
9036 "6096 ELS WQ setup: wq-id=%d, " in lpfc_sli4_queue_setup()
9037 "parent cq-id=%d\n", in lpfc_sli4_queue_setup()
9038 phba->sli4_hba.nvmels_wq->queue_id, in lpfc_sli4_queue_setup()
9039 phba->sli4_hba.nvmels_cq->queue_id); in lpfc_sli4_queue_setup()
9045 if (phba->nvmet_support) { in lpfc_sli4_queue_setup()
9046 if ((!phba->sli4_hba.nvmet_cqset) || in lpfc_sli4_queue_setup()
9047 (!phba->sli4_hba.nvmet_mrq_hdr) || in lpfc_sli4_queue_setup()
9048 (!phba->sli4_hba.nvmet_mrq_data)) { in lpfc_sli4_queue_setup()
9052 rc = -ENOMEM; in lpfc_sli4_queue_setup()
9055 if (phba->cfg_nvmet_mrq > 1) { in lpfc_sli4_queue_setup()
9057 phba->sli4_hba.nvmet_mrq_hdr, in lpfc_sli4_queue_setup()
9058 phba->sli4_hba.nvmet_mrq_data, in lpfc_sli4_queue_setup()
9059 phba->sli4_hba.nvmet_cqset, in lpfc_sli4_queue_setup()
9071 phba->sli4_hba.nvmet_mrq_hdr[0], in lpfc_sli4_queue_setup()
9072 phba->sli4_hba.nvmet_mrq_data[0], in lpfc_sli4_queue_setup()
9073 phba->sli4_hba.nvmet_cqset[0], in lpfc_sli4_queue_setup()
9085 "6099 NVMET RQ setup: hdr-rq-id=%d, " in lpfc_sli4_queue_setup()
9086 "dat-rq-id=%d parent cq-id=%d\n", in lpfc_sli4_queue_setup()
9087 phba->sli4_hba.nvmet_mrq_hdr[0]->queue_id, in lpfc_sli4_queue_setup()
9088 phba->sli4_hba.nvmet_mrq_data[0]->queue_id, in lpfc_sli4_queue_setup()
9089 phba->sli4_hba.nvmet_cqset[0]->queue_id); in lpfc_sli4_queue_setup()
9094 if (!phba->sli4_hba.hdr_rq || !phba->sli4_hba.dat_rq) { in lpfc_sli4_queue_setup()
9097 rc = -ENOMEM; in lpfc_sli4_queue_setup()
9101 rc = lpfc_rq_create(phba, phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq, in lpfc_sli4_queue_setup()
9102 phba->sli4_hba.els_cq, LPFC_USOL); in lpfc_sli4_queue_setup()
9111 "2592 USL RQ setup: hdr-rq-id=%d, dat-rq-id=%d " in lpfc_sli4_queue_setup()
9112 "parent cq-id=%d\n", in lpfc_sli4_queue_setup()
9113 phba->sli4_hba.hdr_rq->queue_id, in lpfc_sli4_queue_setup()
9114 phba->sli4_hba.dat_rq->queue_id, in lpfc_sli4_queue_setup()
9115 phba->sli4_hba.els_cq->queue_id); in lpfc_sli4_queue_setup()
9117 if (phba->cfg_fof) { in lpfc_sli4_queue_setup()
9129 phba->cfg_fcp_imax); in lpfc_sli4_queue_setup()
9140 * lpfc_sli4_queue_unset - Unset all the SLI4 queues
9147 * 0 - successful
9148 * -ENOMEM - No available memory
9149 * -EIO - The mailbox failed to complete successfully.
9157 if (phba->cfg_fof) in lpfc_sli4_queue_unset()
9161 if (phba->sli4_hba.mbx_wq) in lpfc_sli4_queue_unset()
9162 lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); in lpfc_sli4_queue_unset()
9165 if (phba->sli4_hba.nvmels_wq) in lpfc_sli4_queue_unset()
9166 lpfc_wq_destroy(phba, phba->sli4_hba.nvmels_wq); in lpfc_sli4_queue_unset()
9169 if (phba->sli4_hba.els_wq) in lpfc_sli4_queue_unset()
9170 lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); in lpfc_sli4_queue_unset()
9173 if (phba->sli4_hba.hdr_rq) in lpfc_sli4_queue_unset()
9174 lpfc_rq_destroy(phba, phba->sli4_hba.hdr_rq, in lpfc_sli4_queue_unset()
9175 phba->sli4_hba.dat_rq); in lpfc_sli4_queue_unset()
9178 if (phba->sli4_hba.fcp_wq) in lpfc_sli4_queue_unset()
9179 for (qidx = 0; qidx < phba->cfg_fcp_io_channel; qidx++) in lpfc_sli4_queue_unset()
9180 lpfc_wq_destroy(phba, phba->sli4_hba.fcp_wq[qidx]); in lpfc_sli4_queue_unset()
9183 if (phba->sli4_hba.nvme_wq) { in lpfc_sli4_queue_unset()
9184 for (qidx = 0; qidx < phba->cfg_nvme_io_channel; qidx++) in lpfc_sli4_queue_unset()
9185 lpfc_wq_destroy(phba, phba->sli4_hba.nvme_wq[qidx]); in lpfc_sli4_queue_unset()
9189 if (phba->sli4_hba.mbx_cq) in lpfc_sli4_queue_unset()
9190 lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); in lpfc_sli4_queue_unset()
9193 if (phba->sli4_hba.els_cq) in lpfc_sli4_queue_unset()
9194 lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); in lpfc_sli4_queue_unset()
9197 if (phba->sli4_hba.nvmels_cq) in lpfc_sli4_queue_unset()
9198 lpfc_cq_destroy(phba, phba->sli4_hba.nvmels_cq); in lpfc_sli4_queue_unset()
9201 if (phba->sli4_hba.nvme_cq) in lpfc_sli4_queue_unset()
9202 for (qidx = 0; qidx < phba->cfg_nvme_io_channel; qidx++) in lpfc_sli4_queue_unset()
9203 lpfc_cq_destroy(phba, phba->sli4_hba.nvme_cq[qidx]); in lpfc_sli4_queue_unset()
9205 if (phba->nvmet_support) { in lpfc_sli4_queue_unset()
9207 if (phba->sli4_hba.nvmet_mrq_hdr) { in lpfc_sli4_queue_unset()
9208 for (qidx = 0; qidx < phba->cfg_nvmet_mrq; qidx++) in lpfc_sli4_queue_unset()
9211 phba->sli4_hba.nvmet_mrq_hdr[qidx], in lpfc_sli4_queue_unset()
9212 phba->sli4_hba.nvmet_mrq_data[qidx]); in lpfc_sli4_queue_unset()
9216 if (phba->sli4_hba.nvmet_cqset) { in lpfc_sli4_queue_unset()
9217 for (qidx = 0; qidx < phba->cfg_nvmet_mrq; qidx++) in lpfc_sli4_queue_unset()
9219 phba, phba->sli4_hba.nvmet_cqset[qidx]); in lpfc_sli4_queue_unset()
9224 if (phba->sli4_hba.fcp_cq) in lpfc_sli4_queue_unset()
9225 for (qidx = 0; qidx < phba->cfg_fcp_io_channel; qidx++) in lpfc_sli4_queue_unset()
9226 lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[qidx]); in lpfc_sli4_queue_unset()
9228 /* Unset fast-path event queue */ in lpfc_sli4_queue_unset()
9229 if (phba->sli4_hba.hba_eq) in lpfc_sli4_queue_unset()
9230 for (qidx = 0; qidx < phba->io_channel_irqs; qidx++) in lpfc_sli4_queue_unset()
9231 lpfc_eq_destroy(phba, phba->sli4_hba.hba_eq[qidx]); in lpfc_sli4_queue_unset()
9235 * lpfc_sli4_cq_event_pool_create - Create completion-queue event free pool
9242 * - Mailbox asynchronous events
9243 * - Receive queue completion unsolicited events
9244 * Later, this can be used for all the slow-path events.
9247 * 0 - successful
9248 * -ENOMEM - No available memory
9256 for (i = 0; i < (4 * phba->sli4_hba.cq_ecount); i++) { in lpfc_sli4_cq_event_pool_create()
9260 list_add_tail(&cq_event->list, in lpfc_sli4_cq_event_pool_create()
9261 &phba->sli4_hba.sp_cqe_event_pool); in lpfc_sli4_cq_event_pool_create()
9267 return -ENOMEM; in lpfc_sli4_cq_event_pool_create()
9271 * lpfc_sli4_cq_event_pool_destroy - Free completion-queue event free pool
9276 * cleanup routine to free all the outstanding completion-queue events
9286 &phba->sli4_hba.sp_cqe_event_pool, list) { in lpfc_sli4_cq_event_pool_destroy()
9287 list_del(&cq_event->list); in lpfc_sli4_cq_event_pool_destroy()
9293 * __lpfc_sli4_cq_event_alloc - Allocate a completion-queue event from free pool
9297 * completion-queue event from the free pool.
9299 * Return: Pointer to the newly allocated completion-queue event if successful
9307 list_remove_head(&phba->sli4_hba.sp_cqe_event_pool, cq_event, in __lpfc_sli4_cq_event_alloc()
9313 * lpfc_sli4_cq_event_alloc - Allocate a completion-queue event from free pool
9317 * completion-queue event from the free pool.
9319 * Return: Pointer to the newly allocated completion-queue event if successful
9328 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_sli4_cq_event_alloc()
9330 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_sli4_cq_event_alloc()
9335 * __lpfc_sli4_cq_event_release - Release a completion-queue event to free pool
9340 * completion-queue event back into the free pool.
9346 list_add_tail(&cq_event->list, &phba->sli4_hba.sp_cqe_event_pool); in __lpfc_sli4_cq_event_release()
9350 * lpfc_sli4_cq_event_release - Release a completion-queue event to free pool
9355 * completion-queue event back into the free pool.
9362 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_sli4_cq_event_release()
9364 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_sli4_cq_event_release()
9368 * lpfc_sli4_cq_event_release_all - Release all cq events to the free pool
9371 * This routine is to free all the pending completion-queue events to the
9382 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_sli4_cq_event_release_all()
9384 list_splice_init(&phba->sli4_hba.sp_fcp_xri_aborted_work_queue, in lpfc_sli4_cq_event_release_all()
9387 list_splice_init(&phba->sli4_hba.sp_els_xri_aborted_work_queue, in lpfc_sli4_cq_event_release_all()
9390 list_splice_init(&phba->sli4_hba.sp_asynce_work_queue, in lpfc_sli4_cq_event_release_all()
9392 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_sli4_cq_event_release_all()
9401 * lpfc_pci_function_reset - Reset pci function.
9408 * 0 - successful
9409 * -ENOMEM - No available memory
9410 * -EIO - The mailbox failed to complete successfully.
9424 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_pci_function_reset()
9427 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, in lpfc_pci_function_reset()
9434 return -ENOMEM; in lpfc_pci_function_reset()
9437 /* Setup PCI function reset mailbox-ioctl command */ in lpfc_pci_function_reset()
9443 &mboxq->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_pci_function_reset()
9444 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_pci_function_reset()
9446 &shdr->response); in lpfc_pci_function_reset()
9448 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_pci_function_reset()
9455 rc = -ENXIO; in lpfc_pci_function_reset()
9467 if (lpfc_readl(phba->sli4_hba.u.if_type2. in lpfc_pci_function_reset()
9469 rc = -ENODEV; in lpfc_pci_function_reset()
9478 phba->work_status[0] = readl( in lpfc_pci_function_reset()
9479 phba->sli4_hba.u.if_type2.ERR1regaddr); in lpfc_pci_function_reset()
9480 phba->work_status[1] = readl( in lpfc_pci_function_reset()
9481 phba->sli4_hba.u.if_type2.ERR2regaddr); in lpfc_pci_function_reset()
9486 phba->work_status[0], in lpfc_pci_function_reset()
9487 phba->work_status[1]); in lpfc_pci_function_reset()
9488 rc = -ENODEV; in lpfc_pci_function_reset()
9501 writel(reg_data.word0, phba->sli4_hba.u.if_type2. in lpfc_pci_function_reset()
9504 pci_read_config_word(phba->pcidev, in lpfc_pci_function_reset()
9511 rc = -ENODEV; in lpfc_pci_function_reset()
9522 /* Catch the not-ready port failure after a port reset. */ in lpfc_pci_function_reset()
9527 rc = -ENODEV; in lpfc_pci_function_reset()
9534 * lpfc_sli4_pci_mem_setup - Setup SLI4 HBA PCI memory space.
9538 * with SLI-4 interface spec.
9541 * 0 - successful
9542 * other values - error
9549 int error = -ENODEV; in lpfc_sli4_pci_mem_setup()
9553 if (!phba->pcidev) in lpfc_sli4_pci_mem_setup()
9556 pdev = phba->pcidev; in lpfc_sli4_pci_mem_setup()
9572 &phba->sli4_hba.sli_intf.word0)) { in lpfc_sli4_pci_mem_setup()
9577 if (bf_get(lpfc_sli_intf_valid, &phba->sli4_hba.sli_intf) != in lpfc_sli4_pci_mem_setup()
9582 phba->sli4_hba.sli_intf.word0); in lpfc_sli4_pci_mem_setup()
9586 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_pci_mem_setup()
9594 phba->pci_bar0_map = pci_resource_start(pdev, PCI_64BIT_BAR0); in lpfc_sli4_pci_mem_setup()
9601 phba->sli4_hba.conf_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9602 ioremap(phba->pci_bar0_map, bar0map_len); in lpfc_sli4_pci_mem_setup()
9603 if (!phba->sli4_hba.conf_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9604 dev_printk(KERN_ERR, &pdev->dev, in lpfc_sli4_pci_mem_setup()
9609 phba->pci_bar0_memmap_p = phba->sli4_hba.conf_regs_memmap_p; in lpfc_sli4_pci_mem_setup()
9613 phba->pci_bar0_map = pci_resource_start(pdev, 1); in lpfc_sli4_pci_mem_setup()
9616 dev_printk(KERN_ERR, &pdev->dev, in lpfc_sli4_pci_mem_setup()
9617 "FATAL - No BAR0 mapping for SLI4, if_type 2\n"); in lpfc_sli4_pci_mem_setup()
9620 phba->sli4_hba.conf_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9621 ioremap(phba->pci_bar0_map, bar0map_len); in lpfc_sli4_pci_mem_setup()
9622 if (!phba->sli4_hba.conf_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9623 dev_printk(KERN_ERR, &pdev->dev, in lpfc_sli4_pci_mem_setup()
9637 phba->pci_bar1_map = pci_resource_start(pdev, in lpfc_sli4_pci_mem_setup()
9640 phba->sli4_hba.ctrl_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9641 ioremap(phba->pci_bar1_map, in lpfc_sli4_pci_mem_setup()
9643 if (!phba->sli4_hba.ctrl_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9644 dev_err(&pdev->dev, in lpfc_sli4_pci_mem_setup()
9647 error = -ENOMEM; in lpfc_sli4_pci_mem_setup()
9650 phba->pci_bar2_memmap_p = in lpfc_sli4_pci_mem_setup()
9651 phba->sli4_hba.ctrl_regs_memmap_p; in lpfc_sli4_pci_mem_setup()
9654 error = -ENOMEM; in lpfc_sli4_pci_mem_setup()
9665 phba->pci_bar1_map = pci_resource_start(pdev, PCI_64BIT_BAR2); in lpfc_sli4_pci_mem_setup()
9667 phba->sli4_hba.drbl_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9668 ioremap(phba->pci_bar1_map, bar1map_len); in lpfc_sli4_pci_mem_setup()
9669 if (!phba->sli4_hba.drbl_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9670 dev_err(&pdev->dev, in lpfc_sli4_pci_mem_setup()
9674 phba->pci_bar2_memmap_p = phba->sli4_hba.drbl_regs_memmap_p; in lpfc_sli4_pci_mem_setup()
9684 phba->pci_bar2_map = pci_resource_start(pdev, in lpfc_sli4_pci_mem_setup()
9687 phba->sli4_hba.drbl_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9688 ioremap(phba->pci_bar2_map, in lpfc_sli4_pci_mem_setup()
9690 if (!phba->sli4_hba.drbl_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9691 dev_err(&pdev->dev, in lpfc_sli4_pci_mem_setup()
9694 error = -ENOMEM; in lpfc_sli4_pci_mem_setup()
9697 phba->pci_bar4_memmap_p = in lpfc_sli4_pci_mem_setup()
9698 phba->sli4_hba.drbl_regs_memmap_p; in lpfc_sli4_pci_mem_setup()
9703 error = -ENOMEM; in lpfc_sli4_pci_mem_setup()
9714 phba->pci_bar2_map = pci_resource_start(pdev, PCI_64BIT_BAR4); in lpfc_sli4_pci_mem_setup()
9716 phba->sli4_hba.dpp_regs_memmap_p = in lpfc_sli4_pci_mem_setup()
9717 ioremap(phba->pci_bar2_map, bar2map_len); in lpfc_sli4_pci_mem_setup()
9718 if (!phba->sli4_hba.dpp_regs_memmap_p) { in lpfc_sli4_pci_mem_setup()
9719 dev_err(&pdev->dev, in lpfc_sli4_pci_mem_setup()
9723 phba->pci_bar4_memmap_p = phba->sli4_hba.dpp_regs_memmap_p; in lpfc_sli4_pci_mem_setup()
9730 phba->sli4_hba.sli4_eq_clr_intr = lpfc_sli4_eq_clr_intr; in lpfc_sli4_pci_mem_setup()
9731 phba->sli4_hba.sli4_eq_release = lpfc_sli4_eq_release; in lpfc_sli4_pci_mem_setup()
9732 phba->sli4_hba.sli4_cq_release = lpfc_sli4_cq_release; in lpfc_sli4_pci_mem_setup()
9735 phba->sli4_hba.sli4_eq_clr_intr = lpfc_sli4_if6_eq_clr_intr; in lpfc_sli4_pci_mem_setup()
9736 phba->sli4_hba.sli4_eq_release = lpfc_sli4_if6_eq_release; in lpfc_sli4_pci_mem_setup()
9737 phba->sli4_hba.sli4_cq_release = lpfc_sli4_if6_cq_release; in lpfc_sli4_pci_mem_setup()
9746 iounmap(phba->sli4_hba.drbl_regs_memmap_p); in lpfc_sli4_pci_mem_setup()
9748 iounmap(phba->sli4_hba.ctrl_regs_memmap_p); in lpfc_sli4_pci_mem_setup()
9750 iounmap(phba->sli4_hba.conf_regs_memmap_p); in lpfc_sli4_pci_mem_setup()
9756 * lpfc_sli4_pci_mem_unset - Unset SLI4 HBA PCI memory space.
9760 * with SLI-4 interface spec.
9766 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_pci_mem_unset()
9770 iounmap(phba->sli4_hba.drbl_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9771 iounmap(phba->sli4_hba.ctrl_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9772 iounmap(phba->sli4_hba.conf_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9775 iounmap(phba->sli4_hba.conf_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9778 iounmap(phba->sli4_hba.drbl_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9779 iounmap(phba->sli4_hba.conf_regs_memmap_p); in lpfc_sli4_pci_mem_unset()
9783 dev_printk(KERN_ERR, &phba->pcidev->dev, in lpfc_sli4_pci_mem_unset()
9784 "FATAL - unsupported SLI4 interface type - %d\n", in lpfc_sli4_pci_mem_unset()
9791 * lpfc_sli_enable_msix - Enable MSI-X interrupt mode on SLI-3 device
9794 * This routine is invoked to enable the MSI-X interrupt vectors to device
9795 * with SLI-3 interface specs.
9798 * 0 - successful
9799 * other values - error
9807 /* Set up MSI-X multi-message vectors */ in lpfc_sli_enable_msix()
9808 rc = pci_alloc_irq_vectors(phba->pcidev, in lpfc_sli_enable_msix()
9812 "0420 PCI enable MSI-X failed (%d)\n", rc); in lpfc_sli_enable_msix()
9817 * Assign MSI-X vectors to interrupt handlers in lpfc_sli_enable_msix()
9820 /* vector-0 is associated to slow-path handler */ in lpfc_sli_enable_msix()
9821 rc = request_irq(pci_irq_vector(phba->pcidev, 0), in lpfc_sli_enable_msix()
9826 "0421 MSI-X slow-path request_irq failed " in lpfc_sli_enable_msix()
9831 /* vector-1 is associated to fast-path handler */ in lpfc_sli_enable_msix()
9832 rc = request_irq(pci_irq_vector(phba->pcidev, 1), in lpfc_sli_enable_msix()
9838 "0429 MSI-X fast-path request_irq failed " in lpfc_sli_enable_msix()
9844 * Configure HBA MSI-X attention conditions to messages in lpfc_sli_enable_msix()
9846 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli_enable_msix()
9849 rc = -ENOMEM; in lpfc_sli_enable_msix()
9863 pmb->u.mb.mbxCommand, pmb->u.mb.mbxStatus); in lpfc_sli_enable_msix()
9868 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_sli_enable_msix()
9873 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_sli_enable_msix()
9877 free_irq(pci_irq_vector(phba->pcidev, 1), phba); in lpfc_sli_enable_msix()
9881 free_irq(pci_irq_vector(phba->pcidev, 0), phba); in lpfc_sli_enable_msix()
9884 /* Unconfigure MSI-X capability structure */ in lpfc_sli_enable_msix()
9885 pci_free_irq_vectors(phba->pcidev); in lpfc_sli_enable_msix()
9892 * lpfc_sli_enable_msi - Enable MSI interrupt mode on SLI-3 device.
9896 * SLI-3 interface spec. The kernel function pci_enable_msi() is called to
9902 * 0 - successful
9903 * other values - error
9910 rc = pci_enable_msi(phba->pcidev); in lpfc_sli_enable_msi()
9920 rc = request_irq(phba->pcidev->irq, lpfc_sli_intr_handler, in lpfc_sli_enable_msi()
9923 pci_disable_msi(phba->pcidev); in lpfc_sli_enable_msi()
9931 * lpfc_sli_enable_intr - Enable device interrupt to SLI-3 device.
9935 * interrupt handler(s) to interrupt vector(s) to device with SLI-3 interface
9940 * MSI-X -> MSI -> IRQ.
9943 * 0 - successful
9944 * other values - error
9956 /* Now, try to enable MSI-X interrupt mode */ in lpfc_sli_enable_intr()
9959 /* Indicate initialization to MSI-X mode */ in lpfc_sli_enable_intr()
9960 phba->intr_type = MSIX; in lpfc_sli_enable_intr()
9966 /* Fallback to MSI if MSI-X initialization failed */ in lpfc_sli_enable_intr()
9967 if (cfg_mode >= 1 && phba->intr_type == NONE) { in lpfc_sli_enable_intr()
9971 phba->intr_type = MSI; in lpfc_sli_enable_intr()
9976 /* Fallback to INTx if both MSI-X/MSI initalization failed */ in lpfc_sli_enable_intr()
9977 if (phba->intr_type == NONE) { in lpfc_sli_enable_intr()
9978 retval = request_irq(phba->pcidev->irq, lpfc_sli_intr_handler, in lpfc_sli_enable_intr()
9982 phba->intr_type = INTx; in lpfc_sli_enable_intr()
9990 * lpfc_sli_disable_intr - Disable device interrupt to SLI-3 device.
9995 * SLI-3 interface spec. Depending on the interrupt mode, the driver will
10003 if (phba->intr_type == MSIX) in lpfc_sli_disable_intr()
10009 free_irq(pci_irq_vector(phba->pcidev, i), phba); in lpfc_sli_disable_intr()
10010 pci_free_irq_vectors(phba->pcidev); in lpfc_sli_disable_intr()
10013 phba->intr_type = NONE; in lpfc_sli_disable_intr()
10014 phba->sli.slistat.sli_intr = 0; in lpfc_sli_disable_intr()
10018 * lpfc_cpu_affinity_check - Check vector CPU affinity mappings
10022 * The routine will figure out the CPU affinity assignment for every
10023 * MSI-X vector allocated for the HBA. The hba_eq_hdl will be updated
10024 * with a pointer to the CPU mask that defines ALL the CPUs this vector
10026 * a single CPU, that CPU will be recorded in hba_eq_hdl[index].cpu.
10027 * In addition, the CPU to IO channel mapping will be calculated
10028 * and the phba->sli4_hba.cpu_map array will reflect this.
10036 int cpu; in lpfc_cpu_affinity_check() local
10042 memset(phba->sli4_hba.cpu_map, 0xff, in lpfc_cpu_affinity_check()
10044 phba->sli4_hba.num_present_cpu)); in lpfc_cpu_affinity_check()
10046 /* Update CPU map with physical id and core id of each CPU */ in lpfc_cpu_affinity_check()
10047 cpup = phba->sli4_hba.cpu_map; in lpfc_cpu_affinity_check()
10048 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) { in lpfc_cpu_affinity_check()
10050 cpuinfo = &cpu_data(cpu); in lpfc_cpu_affinity_check()
10051 cpup->phys_id = cpuinfo->phys_proc_id; in lpfc_cpu_affinity_check()
10052 cpup->core_id = cpuinfo->cpu_core_id; in lpfc_cpu_affinity_check()
10055 cpup->phys_id = 0; in lpfc_cpu_affinity_check()
10056 cpup->core_id = 0; in lpfc_cpu_affinity_check()
10058 cpup->channel_id = index; /* For now round robin */ in lpfc_cpu_affinity_check()
10059 cpup->irq = pci_irq_vector(phba->pcidev, vec); in lpfc_cpu_affinity_check()
10064 if (index >= phba->cfg_fcp_io_channel) in lpfc_cpu_affinity_check()
10072 * lpfc_sli4_enable_msix - Enable MSI-X interrupt mode to SLI-4 device
10075 * This routine is invoked to enable the MSI-X interrupt vectors to device
10076 * with SLI-4 interface spec.
10079 * 0 - successful
10080 * other values - error
10088 /* Set up MSI-X multi-message vectors */ in lpfc_sli4_enable_msix()
10089 vectors = phba->io_channel_irqs; in lpfc_sli4_enable_msix()
10090 if (phba->cfg_fof) in lpfc_sli4_enable_msix()
10093 rc = pci_alloc_irq_vectors(phba->pcidev, in lpfc_sli4_enable_msix()
10094 (phba->nvmet_support) ? 1 : 2, in lpfc_sli4_enable_msix()
10098 "0484 PCI enable MSI-X failed (%d)\n", rc); in lpfc_sli4_enable_msix()
10103 /* Assign MSI-X vectors to interrupt handlers */ in lpfc_sli4_enable_msix()
10105 name = phba->sli4_hba.hba_eq_hdl[index].handler_name; in lpfc_sli4_enable_msix()
10110 phba->sli4_hba.hba_eq_hdl[index].idx = index; in lpfc_sli4_enable_msix()
10111 phba->sli4_hba.hba_eq_hdl[index].phba = phba; in lpfc_sli4_enable_msix()
10112 atomic_set(&phba->sli4_hba.hba_eq_hdl[index].hba_eq_in_use, 1); in lpfc_sli4_enable_msix()
10113 if (phba->cfg_fof && (index == (vectors - 1))) in lpfc_sli4_enable_msix()
10114 rc = request_irq(pci_irq_vector(phba->pcidev, index), in lpfc_sli4_enable_msix()
10117 &phba->sli4_hba.hba_eq_hdl[index]); in lpfc_sli4_enable_msix()
10119 rc = request_irq(pci_irq_vector(phba->pcidev, index), in lpfc_sli4_enable_msix()
10122 &phba->sli4_hba.hba_eq_hdl[index]); in lpfc_sli4_enable_msix()
10125 "0486 MSI-X fast-path (%d) " in lpfc_sli4_enable_msix()
10131 if (phba->cfg_fof) in lpfc_sli4_enable_msix()
10132 vectors--; in lpfc_sli4_enable_msix()
10134 if (vectors != phba->io_channel_irqs) { in lpfc_sli4_enable_msix()
10137 "MSI-X vectors, requested %d got %d\n", in lpfc_sli4_enable_msix()
10138 phba->io_channel_irqs, vectors); in lpfc_sli4_enable_msix()
10139 if (phba->cfg_fcp_io_channel > vectors) in lpfc_sli4_enable_msix()
10140 phba->cfg_fcp_io_channel = vectors; in lpfc_sli4_enable_msix()
10141 if (phba->cfg_nvme_io_channel > vectors) in lpfc_sli4_enable_msix()
10142 phba->cfg_nvme_io_channel = vectors; in lpfc_sli4_enable_msix()
10143 if (phba->cfg_fcp_io_channel > phba->cfg_nvme_io_channel) in lpfc_sli4_enable_msix()
10144 phba->io_channel_irqs = phba->cfg_fcp_io_channel; in lpfc_sli4_enable_msix()
10146 phba->io_channel_irqs = phba->cfg_nvme_io_channel; in lpfc_sli4_enable_msix()
10154 for (--index; index >= 0; index--) in lpfc_sli4_enable_msix()
10155 free_irq(pci_irq_vector(phba->pcidev, index), in lpfc_sli4_enable_msix()
10156 &phba->sli4_hba.hba_eq_hdl[index]); in lpfc_sli4_enable_msix()
10158 /* Unconfigure MSI-X capability structure */ in lpfc_sli4_enable_msix()
10159 pci_free_irq_vectors(phba->pcidev); in lpfc_sli4_enable_msix()
10166 * lpfc_sli4_enable_msi - Enable MSI interrupt mode to SLI-4 device
10170 * SLI-4 interface spec. The kernel function pci_enable_msi() is called
10176 * 0 - successful
10177 * other values - error
10184 rc = pci_enable_msi(phba->pcidev); in lpfc_sli4_enable_msi()
10194 rc = request_irq(phba->pcidev->irq, lpfc_sli4_intr_handler, in lpfc_sli4_enable_msi()
10197 pci_disable_msi(phba->pcidev); in lpfc_sli4_enable_msi()
10203 for (index = 0; index < phba->io_channel_irqs; index++) { in lpfc_sli4_enable_msi()
10204 phba->sli4_hba.hba_eq_hdl[index].idx = index; in lpfc_sli4_enable_msi()
10205 phba->sli4_hba.hba_eq_hdl[index].phba = phba; in lpfc_sli4_enable_msi()
10208 if (phba->cfg_fof) { in lpfc_sli4_enable_msi()
10209 phba->sli4_hba.hba_eq_hdl[index].idx = index; in lpfc_sli4_enable_msi()
10210 phba->sli4_hba.hba_eq_hdl[index].phba = phba; in lpfc_sli4_enable_msi()
10216 * lpfc_sli4_enable_intr - Enable device interrupt to SLI-4 device
10220 * interrupt handler(s) to interrupt vector(s) to device with SLI-4
10225 * MSI-X -> MSI -> IRQ.
10228 * 0 - successful
10229 * other values - error
10241 /* Now, try to enable MSI-X interrupt mode */ in lpfc_sli4_enable_intr()
10244 /* Indicate initialization to MSI-X mode */ in lpfc_sli4_enable_intr()
10245 phba->intr_type = MSIX; in lpfc_sli4_enable_intr()
10251 /* Fallback to MSI if MSI-X initialization failed */ in lpfc_sli4_enable_intr()
10252 if (cfg_mode >= 1 && phba->intr_type == NONE) { in lpfc_sli4_enable_intr()
10256 phba->intr_type = MSI; in lpfc_sli4_enable_intr()
10261 /* Fallback to INTx if both MSI-X/MSI initalization failed */ in lpfc_sli4_enable_intr()
10262 if (phba->intr_type == NONE) { in lpfc_sli4_enable_intr()
10263 retval = request_irq(phba->pcidev->irq, lpfc_sli4_intr_handler, in lpfc_sli4_enable_intr()
10269 phba->intr_type = INTx; in lpfc_sli4_enable_intr()
10272 for (idx = 0; idx < phba->io_channel_irqs; idx++) { in lpfc_sli4_enable_intr()
10273 eqhdl = &phba->sli4_hba.hba_eq_hdl[idx]; in lpfc_sli4_enable_intr()
10274 eqhdl->idx = idx; in lpfc_sli4_enable_intr()
10275 eqhdl->phba = phba; in lpfc_sli4_enable_intr()
10276 atomic_set(&eqhdl->hba_eq_in_use, 1); in lpfc_sli4_enable_intr()
10278 if (phba->cfg_fof) { in lpfc_sli4_enable_intr()
10279 eqhdl = &phba->sli4_hba.hba_eq_hdl[idx]; in lpfc_sli4_enable_intr()
10280 eqhdl->idx = idx; in lpfc_sli4_enable_intr()
10281 eqhdl->phba = phba; in lpfc_sli4_enable_intr()
10282 atomic_set(&eqhdl->hba_eq_in_use, 1); in lpfc_sli4_enable_intr()
10290 * lpfc_sli4_disable_intr - Disable device interrupt to SLI-4 device
10295 * with SLI-4 interface spec. Depending on the interrupt mode, the driver
10302 if (phba->intr_type == MSIX) { in lpfc_sli4_disable_intr()
10305 /* Free up MSI-X multi-message vectors */ in lpfc_sli4_disable_intr()
10306 for (index = 0; index < phba->io_channel_irqs; index++) in lpfc_sli4_disable_intr()
10307 free_irq(pci_irq_vector(phba->pcidev, index), in lpfc_sli4_disable_intr()
10308 &phba->sli4_hba.hba_eq_hdl[index]); in lpfc_sli4_disable_intr()
10310 if (phba->cfg_fof) in lpfc_sli4_disable_intr()
10311 free_irq(pci_irq_vector(phba->pcidev, index), in lpfc_sli4_disable_intr()
10312 &phba->sli4_hba.hba_eq_hdl[index]); in lpfc_sli4_disable_intr()
10314 free_irq(phba->pcidev->irq, phba); in lpfc_sli4_disable_intr()
10317 pci_free_irq_vectors(phba->pcidev); in lpfc_sli4_disable_intr()
10320 phba->intr_type = NONE; in lpfc_sli4_disable_intr()
10321 phba->sli.slistat.sli_intr = 0; in lpfc_sli4_disable_intr()
10325 * lpfc_unset_hba - Unset SLI3 hba device initialization
10329 * a device with SLI-3 interface spec.
10334 struct lpfc_vport *vport = phba->pport; in lpfc_unset_hba()
10337 spin_lock_irq(shost->host_lock); in lpfc_unset_hba()
10338 vport->load_flag |= FC_UNLOADING; in lpfc_unset_hba()
10339 spin_unlock_irq(shost->host_lock); in lpfc_unset_hba()
10341 kfree(phba->vpi_bmask); in lpfc_unset_hba()
10342 kfree(phba->vpi_ids); in lpfc_unset_hba()
10346 phba->pport->work_port_events = 0; in lpfc_unset_hba()
10358 * lpfc_sli4_xri_exchange_busy_wait - Wait for device XRI exchange busy
10377 int els_xri_cmpl = list_empty(&phba->sli4_hba.lpfc_abts_els_sgl_list); in lpfc_sli4_xri_exchange_busy_wait()
10386 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) in lpfc_sli4_xri_exchange_busy_wait()
10389 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) in lpfc_sli4_xri_exchange_busy_wait()
10391 list_empty(&phba->sli4_hba.lpfc_abts_scsi_buf_list); in lpfc_sli4_xri_exchange_busy_wait()
10392 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_sli4_xri_exchange_busy_wait()
10394 list_empty(&phba->sli4_hba.lpfc_abts_nvme_buf_list); in lpfc_sli4_xri_exchange_busy_wait()
10396 list_empty(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list); in lpfc_sli4_xri_exchange_busy_wait()
10428 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_sli4_xri_exchange_busy_wait()
10430 &phba->sli4_hba.lpfc_abts_nvme_buf_list); in lpfc_sli4_xri_exchange_busy_wait()
10432 &phba->sli4_hba.lpfc_abts_nvmet_ctx_list); in lpfc_sli4_xri_exchange_busy_wait()
10435 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) in lpfc_sli4_xri_exchange_busy_wait()
10437 &phba->sli4_hba.lpfc_abts_scsi_buf_list); in lpfc_sli4_xri_exchange_busy_wait()
10440 list_empty(&phba->sli4_hba.lpfc_abts_els_sgl_list); in lpfc_sli4_xri_exchange_busy_wait()
10446 * lpfc_sli4_hba_unset - Unset the fcoe hba
10460 struct pci_dev *pdev = phba->pcidev; in lpfc_sli4_hba_unset()
10463 phba->sli4_hba.intr_enable = 0; in lpfc_sli4_hba_unset()
10471 spin_lock_irq(&phba->hbalock); in lpfc_sli4_hba_unset()
10472 phba->sli.sli_flag |= LPFC_SLI_ASYNC_MBX_BLK; in lpfc_sli4_hba_unset()
10473 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_hba_unset()
10475 while (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE) { in lpfc_sli4_hba_unset()
10481 if (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE) { in lpfc_sli4_hba_unset()
10482 spin_lock_irq(&phba->hbalock); in lpfc_sli4_hba_unset()
10483 mboxq = phba->sli.mbox_active; in lpfc_sli4_hba_unset()
10484 mboxq->u.mb.mbxStatus = MBX_NOT_FINISHED; in lpfc_sli4_hba_unset()
10486 phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; in lpfc_sli4_hba_unset()
10487 phba->sli.mbox_active = NULL; in lpfc_sli4_hba_unset()
10488 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_hba_unset()
10500 /* Disable SR-IOV if enabled */ in lpfc_sli4_hba_unset()
10501 if (phba->cfg_sriov_nr_virtfn) in lpfc_sli4_hba_unset()
10505 kthread_stop(phba->worker_thread); in lpfc_sli4_hba_unset()
10517 phba->pport->work_port_events = 0; in lpfc_sli4_hba_unset()
10521 * lpfc_pc_sli4_params_get - Get the SLI4_PARAMS port capabilities.
10528 * This function may be be called from any context that can block-wait
10541 mqe = &mboxq->u.mqe; in lpfc_pc_sli4_params_get()
10545 if (!phba->sli4_hba.intr_enable) in lpfc_pc_sli4_params_get()
10555 sli4_params = &phba->sli4_hba.pc_sli4_params; in lpfc_pc_sli4_params_get()
10556 sli4_params->if_type = bf_get(if_type, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10557 sli4_params->sli_rev = bf_get(sli_rev, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10558 sli4_params->sli_family = bf_get(sli_family, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10559 sli4_params->featurelevel_1 = bf_get(featurelevel_1, in lpfc_pc_sli4_params_get()
10560 &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10561 sli4_params->featurelevel_2 = bf_get(featurelevel_2, in lpfc_pc_sli4_params_get()
10562 &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10563 sli4_params->proto_types = mqe->un.sli4_params.word3; in lpfc_pc_sli4_params_get()
10564 sli4_params->sge_supp_len = mqe->un.sli4_params.sge_supp_len; in lpfc_pc_sli4_params_get()
10565 sli4_params->if_page_sz = bf_get(if_page_sz, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10566 sli4_params->rq_db_window = bf_get(rq_db_window, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10567 sli4_params->loopbk_scope = bf_get(loopbk_scope, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10568 sli4_params->eq_pages_max = bf_get(eq_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10569 sli4_params->eqe_size = bf_get(eqe_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10570 sli4_params->cq_pages_max = bf_get(cq_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10571 sli4_params->cqe_size = bf_get(cqe_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10572 sli4_params->mq_pages_max = bf_get(mq_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10573 sli4_params->mqe_size = bf_get(mqe_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10574 sli4_params->mq_elem_cnt = bf_get(mq_elem_cnt, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10575 sli4_params->wq_pages_max = bf_get(wq_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10576 sli4_params->wqe_size = bf_get(wqe_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10577 sli4_params->rq_pages_max = bf_get(rq_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10578 sli4_params->rqe_size = bf_get(rqe_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10579 sli4_params->hdr_pages_max = bf_get(hdr_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10580 sli4_params->hdr_size = bf_get(hdr_size, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10581 sli4_params->hdr_pp_align = bf_get(hdr_pp_align, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10582 sli4_params->sgl_pages_max = bf_get(sgl_pages, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10583 sli4_params->sgl_pp_align = bf_get(sgl_pp_align, &mqe->un.sli4_params); in lpfc_pc_sli4_params_get()
10586 if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE) in lpfc_pc_sli4_params_get()
10587 sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE; in lpfc_pc_sli4_params_get()
10593 * lpfc_get_sli4_parameters - Get the SLI4 Config PARAMETERS.
10600 * This function may be be called from any context that can block-wait
10608 struct lpfc_mqe *mqe = &mboxq->u.mqe; in lpfc_get_sli4_parameters()
10620 phba->sli4_hba.rpi_hdrs_in_use = 1; in lpfc_get_sli4_parameters()
10623 length = (sizeof(struct lpfc_mbx_get_sli4_parameters) - in lpfc_get_sli4_parameters()
10628 if (!phba->sli4_hba.intr_enable) in lpfc_get_sli4_parameters()
10636 sli4_params = &phba->sli4_hba.pc_sli4_params; in lpfc_get_sli4_parameters()
10637 mbx_sli4_parameters = &mqe->un.get_sli4_parameters.sli4_parameters; in lpfc_get_sli4_parameters()
10638 sli4_params->if_type = bf_get(cfg_if_type, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10639 sli4_params->sli_rev = bf_get(cfg_sli_rev, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10640 sli4_params->sli_family = bf_get(cfg_sli_family, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10641 sli4_params->featurelevel_1 = bf_get(cfg_sli_hint_1, in lpfc_get_sli4_parameters()
10643 sli4_params->featurelevel_2 = bf_get(cfg_sli_hint_2, in lpfc_get_sli4_parameters()
10646 phba->sli3_options |= LPFC_SLI4_PHWQ_ENABLED; in lpfc_get_sli4_parameters()
10648 phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED; in lpfc_get_sli4_parameters()
10649 sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len; in lpfc_get_sli4_parameters()
10650 sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10651 sli4_params->oas_supported = bf_get(cfg_oas, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10652 sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10653 sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10654 sli4_params->wqv = bf_get(cfg_wqv, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10655 sli4_params->rqv = bf_get(cfg_rqv, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10656 sli4_params->eqav = bf_get(cfg_eqav, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10657 sli4_params->cqav = bf_get(cfg_cqav, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10658 sli4_params->wqsize = bf_get(cfg_wqsize, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10659 sli4_params->bv1s = bf_get(cfg_bv1s, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10660 sli4_params->sgl_pages_max = bf_get(cfg_sgl_page_cnt, in lpfc_get_sli4_parameters()
10662 sli4_params->wqpcnt = bf_get(cfg_wqpcnt, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10663 sli4_params->sgl_pp_align = bf_get(cfg_sgl_pp_align, in lpfc_get_sli4_parameters()
10665 phba->sli4_hba.extents_in_use = bf_get(cfg_ext, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10666 phba->sli4_hba.rpi_hdrs_in_use = bf_get(cfg_hdrr, mbx_sli4_parameters); in lpfc_get_sli4_parameters()
10667 phba->nvme_support = (bf_get(cfg_nvme, mbx_sli4_parameters) && in lpfc_get_sli4_parameters()
10670 if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_FCP) || in lpfc_get_sli4_parameters()
10671 !phba->nvme_support) { in lpfc_get_sli4_parameters()
10672 phba->nvme_support = 0; in lpfc_get_sli4_parameters()
10673 phba->nvmet_support = 0; in lpfc_get_sli4_parameters()
10674 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_OFF; in lpfc_get_sli4_parameters()
10675 phba->cfg_nvme_io_channel = 0; in lpfc_get_sli4_parameters()
10676 phba->io_channel_irqs = phba->cfg_fcp_io_channel; in lpfc_get_sli4_parameters()
10684 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP)) in lpfc_get_sli4_parameters()
10685 return -ENODEV; in lpfc_get_sli4_parameters()
10686 phba->cfg_enable_fc4_type = LPFC_ENABLE_FCP; in lpfc_get_sli4_parameters()
10690 if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_get_sli4_parameters()
10692 phba->cfg_enable_pbde = 0; in lpfc_get_sli4_parameters()
10697 * In SLI4-Parameters Descriptor: in lpfc_get_sli4_parameters()
10702 if (phba->cfg_suppress_rsp && bf_get(cfg_xib, mbx_sli4_parameters) && in lpfc_get_sli4_parameters()
10704 phba->sli.sli_flag |= LPFC_SLI_SUPPRESS_RSP; in lpfc_get_sli4_parameters()
10706 phba->cfg_suppress_rsp = 0; in lpfc_get_sli4_parameters()
10709 phba->sli.sli_flag |= LPFC_SLI_USE_EQDR; in lpfc_get_sli4_parameters()
10712 if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE) in lpfc_get_sli4_parameters()
10713 sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE; in lpfc_get_sli4_parameters()
10718 * to use this option, 128-byte WQEs must be used. in lpfc_get_sli4_parameters()
10721 phba->fcp_embed_io = 1; in lpfc_get_sli4_parameters()
10723 phba->fcp_embed_io = 0; in lpfc_get_sli4_parameters()
10728 phba->cfg_enable_pbde, in lpfc_get_sli4_parameters()
10729 phba->fcp_embed_io, phba->nvme_support, in lpfc_get_sli4_parameters()
10730 phba->cfg_nvme_embed_cmd, phba->cfg_suppress_rsp); in lpfc_get_sli4_parameters()
10732 if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == in lpfc_get_sli4_parameters()
10734 (bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf) == in lpfc_get_sli4_parameters()
10741 (sli4_params->wqsize & LPFC_WQ_SZ128_SUPPORT)) in lpfc_get_sli4_parameters()
10742 phba->enab_exp_wqcq_pages = 1; in lpfc_get_sli4_parameters()
10744 phba->enab_exp_wqcq_pages = 0; in lpfc_get_sli4_parameters()
10749 phba->mds_diags_support = 1; in lpfc_get_sli4_parameters()
10751 phba->mds_diags_support = 0; in lpfc_get_sli4_parameters()
10756 * lpfc_pci_probe_one_s3 - PCI probe func to reg SLI-3 device to PCI subsystem.
10760 * This routine is to be called to attach a device with SLI-3 interface spec
10761 * to the PCI subsystem. When an Emulex HBA with SLI-3 interface spec is
10762 * presented on PCI bus, the kernel PCI subsystem looks at PCI device-specific
10769 * 0 - driver can claim the device
10770 * negative value - driver can not claim the device
10784 return -ENOMEM; in lpfc_pci_probe_one_s3()
10791 /* Set up SLI API function jump table for PCI-device group-0 HBAs */ in lpfc_pci_probe_one_s3()
10796 /* Set up SLI-3 specific device PCI memory space */ in lpfc_pci_probe_one_s3()
10804 /* Set up SLI-3 specific device driver resources */ in lpfc_pci_probe_one_s3()
10830 lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); in lpfc_pci_probe_one_s3()
10841 vport = phba->pport; in lpfc_pci_probe_one_s3()
10851 cfg_mode = phba->cfg_use_msi; in lpfc_pci_probe_one_s3()
10860 error = -ENODEV; in lpfc_pci_probe_one_s3()
10863 /* SLI-3 HBA setup */ in lpfc_pci_probe_one_s3()
10867 error = -ENODEV; in lpfc_pci_probe_one_s3()
10875 phba->sli.slistat.sli_intr > LPFC_MSIX_VECTORS) { in lpfc_pci_probe_one_s3()
10877 phba->intr_mode = intr_mode; in lpfc_pci_probe_one_s3()
10888 cfg_mode = --intr_mode; in lpfc_pci_probe_one_s3()
10924 * lpfc_pci_remove_one_s3 - PCI func to unreg SLI-3 device from PCI subsystem.
10927 * This routine is to be called to disattach a device with SLI-3 interface
10928 * spec from PCI subsystem. When an Emulex HBA with SLI-3 interface spec is
10936 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; in lpfc_pci_remove_one_s3()
10938 struct lpfc_hba *phba = vport->phba; in lpfc_pci_remove_one_s3()
10941 spin_lock_irq(&phba->hbalock); in lpfc_pci_remove_one_s3()
10942 vport->load_flag |= FC_UNLOADING; in lpfc_pci_remove_one_s3()
10943 spin_unlock_irq(&phba->hbalock); in lpfc_pci_remove_one_s3()
10950 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_pci_remove_one_s3()
10951 if (vports[i]->port_type == LPFC_PHYSICAL_PORT) in lpfc_pci_remove_one_s3()
10953 fc_vport_terminate(vports[i]->fc_vport); in lpfc_pci_remove_one_s3()
10972 kthread_stop(phba->worker_thread); in lpfc_pci_remove_one_s3()
10976 kfree(phba->vpi_bmask); in lpfc_pci_remove_one_s3()
10977 kfree(phba->vpi_ids); in lpfc_pci_remove_one_s3()
10980 spin_lock_irq(&phba->hbalock); in lpfc_pci_remove_one_s3()
10981 list_del_init(&vport->listentry); in lpfc_pci_remove_one_s3()
10982 spin_unlock_irq(&phba->hbalock); in lpfc_pci_remove_one_s3()
10986 /* Disable SR-IOV if enabled */ in lpfc_pci_remove_one_s3()
10987 if (phba->cfg_sriov_nr_virtfn) in lpfc_pci_remove_one_s3()
11002 dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), in lpfc_pci_remove_one_s3()
11003 phba->hbqslimp.virt, phba->hbqslimp.phys); in lpfc_pci_remove_one_s3()
11006 dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, in lpfc_pci_remove_one_s3()
11007 phba->slim2p.virt, phba->slim2p.phys); in lpfc_pci_remove_one_s3()
11010 iounmap(phba->ctrl_regs_memmap_p); in lpfc_pci_remove_one_s3()
11011 iounmap(phba->slim_memmap_p); in lpfc_pci_remove_one_s3()
11020 * lpfc_pci_suspend_one_s3 - PCI func to suspend SLI-3 device for power mgmnt
11025 * system Power Management (PM) to device with SLI-3 interface spec. When
11029 * minimum PM requirements to a power-aware driver's PM support for the
11030 * suspend/resume -- all the possible PM messages (SUSPEND, HIBERNATE, FREEZE)
11037 * 0 - driver suspended the device
11044 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_suspend_one_s3()
11052 kthread_stop(phba->worker_thread); in lpfc_pci_suspend_one_s3()
11065 * lpfc_pci_resume_one_s3 - PCI func to resume SLI-3 device for power mgmnt
11069 * system Power Management (PM) to device with SLI-3 interface spec. When PM
11072 * driver implements the minimum PM requirements to a power-aware driver's
11073 * PM for suspend/resume -- all the possible PM messages (SUSPEND, HIBERNATE,
11080 * 0 - driver suspended the device
11087 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_resume_one_s3()
11104 if (pdev->is_busmaster) in lpfc_pci_resume_one_s3()
11108 phba->worker_thread = kthread_run(lpfc_do_work, phba, in lpfc_pci_resume_one_s3()
11109 "lpfc_worker_%d", phba->brd_no); in lpfc_pci_resume_one_s3()
11110 if (IS_ERR(phba->worker_thread)) { in lpfc_pci_resume_one_s3()
11111 error = PTR_ERR(phba->worker_thread); in lpfc_pci_resume_one_s3()
11119 intr_mode = lpfc_sli_enable_intr(phba, phba->intr_mode); in lpfc_pci_resume_one_s3()
11123 return -EIO; in lpfc_pci_resume_one_s3()
11125 phba->intr_mode = intr_mode; in lpfc_pci_resume_one_s3()
11132 lpfc_log_intr_mode(phba, phba->intr_mode); in lpfc_pci_resume_one_s3()
11138 * lpfc_sli_prep_dev_for_recover - Prepare SLI3 device for pci slot recover
11152 * and let the SCSI mid-layer to retry them to recover. in lpfc_sli_prep_dev_for_recover()
11158 * lpfc_sli_prep_dev_for_reset - Prepare SLI3 device for pci slot reset
11185 pci_disable_device(phba->pcidev); in lpfc_sli_prep_dev_for_reset()
11189 * lpfc_sli_prep_dev_for_perm_failure - Prepare SLI3 dev for pci slot disable
11212 * lpfc_io_error_detected_s3 - Method for handling SLI-3 device PCI I/O error
11217 * device with SLI-3 interface spec. This function is called by the PCI
11225 * PCI_ERS_RESULT_CAN_RECOVER - can be recovered with reset_link
11226 * PCI_ERS_RESULT_NEED_RESET - need to reset before recovery
11227 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
11233 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_error_detected_s3()
11237 /* Non-fatal error, prepare for recovery */ in lpfc_io_error_detected_s3()
11258 * lpfc_io_slot_reset_s3 - Method for restarting PCI SLI-3 device from scratch.
11262 * device with SLI-3 interface spec. This is called after PCI bus has been
11263 * reset to restart the PCI card from scratch, as if from a cold-boot.
11272 * PCI_ERS_RESULT_RECOVERED - the device has been recovered
11273 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
11279 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_slot_reset_s3()
11280 struct lpfc_sli *psli = &phba->sli; in lpfc_io_slot_reset_s3()
11283 dev_printk(KERN_INFO, &pdev->dev, "recovering from a slot reset.\n"); in lpfc_io_slot_reset_s3()
11285 printk(KERN_ERR "lpfc: Cannot re-enable " in lpfc_io_slot_reset_s3()
11298 if (pdev->is_busmaster) in lpfc_io_slot_reset_s3()
11301 spin_lock_irq(&phba->hbalock); in lpfc_io_slot_reset_s3()
11302 psli->sli_flag &= ~LPFC_SLI_ACTIVE; in lpfc_io_slot_reset_s3()
11303 spin_unlock_irq(&phba->hbalock); in lpfc_io_slot_reset_s3()
11306 intr_mode = lpfc_sli_enable_intr(phba, phba->intr_mode); in lpfc_io_slot_reset_s3()
11309 "0427 Cannot re-enable interrupt after " in lpfc_io_slot_reset_s3()
11313 phba->intr_mode = intr_mode; in lpfc_io_slot_reset_s3()
11321 lpfc_log_intr_mode(phba, phba->intr_mode); in lpfc_io_slot_reset_s3()
11327 * lpfc_io_resume_s3 - Method for resuming PCI I/O operation on SLI-3 device.
11331 * with SLI-3 interface spec. It is called when kernel error recovery tells
11340 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_resume_s3()
11342 /* Bring device online, it will be no-op for non-fatal error resume */ in lpfc_io_resume_s3()
11346 if (phba->hba_flag & HBA_AER_ENABLED) in lpfc_io_resume_s3()
11351 * lpfc_sli4_get_els_iocb_cnt - Calculate the # of ELS IOCBs to reserve
11359 int max_xri = phba->sli4_hba.max_cfg_param.max_xri; in lpfc_sli4_get_els_iocb_cnt()
11361 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_sli4_get_els_iocb_cnt()
11381 * lpfc_sli4_get_iocb_cnt - Calculate the # of total IOCBs to reserve
11391 if (phba->nvmet_support) in lpfc_sli4_get_iocb_cnt()
11403 (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC && in lpfc_log_write_firmware_error()
11405 (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC && in lpfc_log_write_firmware_error()
11411 phba->pcidev->device, magic_number, ftype, fid, in lpfc_log_write_firmware_error()
11412 fsize, fw->size); in lpfc_log_write_firmware_error()
11417 phba->pcidev->device, magic_number, ftype, fid, in lpfc_log_write_firmware_error()
11418 fsize, fw->size); in lpfc_log_write_firmware_error()
11423 * lpfc_write_firmware - attempt to write a firmware image to the port
11440 /* It can be null in no-wait mode, sanity check */ in lpfc_write_firmware()
11442 rc = -ENXIO; in lpfc_write_firmware()
11445 image = (struct lpfc_grp_hdr *)fw->data; in lpfc_write_firmware()
11447 magic_number = be32_to_cpu(image->magic_number); in lpfc_write_firmware()
11450 fsize = be32_to_cpu(image->size); in lpfc_write_firmware()
11454 if (strncmp(fwrev, image->revision, strnlen(image->revision, 16))) { in lpfc_write_firmware()
11458 fwrev, image->revision); in lpfc_write_firmware()
11463 rc = -ENOMEM; in lpfc_write_firmware()
11466 dmabuf->virt = dma_alloc_coherent(&phba->pcidev->dev, in lpfc_write_firmware()
11468 &dmabuf->phys, in lpfc_write_firmware()
11470 if (!dmabuf->virt) { in lpfc_write_firmware()
11472 rc = -ENOMEM; in lpfc_write_firmware()
11475 list_add_tail(&dmabuf->list, &dma_buffer_list); in lpfc_write_firmware()
11477 while (offset < fw->size) { in lpfc_write_firmware()
11480 if (temp_offset + SLI4_PAGE_SIZE > fw->size) { in lpfc_write_firmware()
11481 memcpy(dmabuf->virt, in lpfc_write_firmware()
11482 fw->data + temp_offset, in lpfc_write_firmware()
11483 fw->size - temp_offset); in lpfc_write_firmware()
11484 temp_offset = fw->size; in lpfc_write_firmware()
11487 memcpy(dmabuf->virt, fw->data + temp_offset, in lpfc_write_firmware()
11492 (fw->size - offset), &offset); in lpfc_write_firmware()
11504 fwrev, image->revision); in lpfc_write_firmware()
11508 list_del(&dmabuf->list); in lpfc_write_firmware()
11509 dma_free_coherent(&phba->pcidev->dev, SLI4_PAGE_SIZE, in lpfc_write_firmware()
11510 dmabuf->virt, dmabuf->phys); in lpfc_write_firmware()
11521 * lpfc_sli4_request_firmware_update - Request linux generic firmware upgrade
11535 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_sli4_request_firmware_update()
11537 return -EPERM; in lpfc_sli4_request_firmware_update()
11539 snprintf(file_name, ELX_MODEL_NAME_SIZE, "%s.grp", phba->ModelName); in lpfc_sli4_request_firmware_update()
11543 file_name, &phba->pcidev->dev, in lpfc_sli4_request_firmware_update()
11547 ret = request_firmware(&fw, file_name, &phba->pcidev->dev); in lpfc_sli4_request_firmware_update()
11551 ret = -EINVAL; in lpfc_sli4_request_firmware_update()
11558 * lpfc_pci_probe_one_s4 - PCI probe func to reg SLI-4 device to PCI subsys
11563 * SLI-4 interface spec. When an Emulex HBA with SLI-4 interface spec is
11564 * presented on PCI bus, the kernel PCI subsystem looks at PCI device-specific
11572 * 0 - driver can claim the device
11573 * negative value - driver can not claim the device
11587 return -ENOMEM; in lpfc_pci_probe_one_s4()
11594 /* Set up SLI API function jump table for PCI-device group-1 HBAs */ in lpfc_pci_probe_one_s4()
11599 /* Set up SLI-4 specific device PCI memory space */ in lpfc_pci_probe_one_s4()
11607 /* Set up SLI-4 Specific device driver resources */ in lpfc_pci_probe_one_s4()
11615 INIT_LIST_HEAD(&phba->active_rrq_list); in lpfc_pci_probe_one_s4()
11616 INIT_LIST_HEAD(&phba->fcf.fcf_pri_list); in lpfc_pci_probe_one_s4()
11627 lpfc_get_hba_model_desc(phba, phba->ModelName, phba->ModelDesc); in lpfc_pci_probe_one_s4()
11638 vport = phba->pport; in lpfc_pci_probe_one_s4()
11648 cfg_mode = phba->cfg_use_msi; in lpfc_pci_probe_one_s4()
11658 error = -ENODEV; in lpfc_pci_probe_one_s4()
11661 /* Default to single EQ for non-MSI-X */ in lpfc_pci_probe_one_s4()
11662 if (phba->intr_type != MSIX) { in lpfc_pci_probe_one_s4()
11663 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) in lpfc_pci_probe_one_s4()
11664 phba->cfg_fcp_io_channel = 1; in lpfc_pci_probe_one_s4()
11665 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { in lpfc_pci_probe_one_s4()
11666 phba->cfg_nvme_io_channel = 1; in lpfc_pci_probe_one_s4()
11667 if (phba->nvmet_support) in lpfc_pci_probe_one_s4()
11668 phba->cfg_nvmet_mrq = 1; in lpfc_pci_probe_one_s4()
11670 phba->io_channel_irqs = 1; in lpfc_pci_probe_one_s4()
11673 /* Set up SLI-4 HBA */ in lpfc_pci_probe_one_s4()
11677 error = -ENODEV; in lpfc_pci_probe_one_s4()
11682 phba->intr_mode = intr_mode; in lpfc_pci_probe_one_s4()
11691 if ((phba->nvmet_support == 0) && in lpfc_pci_probe_one_s4()
11692 (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME)) { in lpfc_pci_probe_one_s4()
11708 if (phba->cfg_request_firmware_upgrade) in lpfc_pci_probe_one_s4()
11737 * lpfc_pci_remove_one_s4 - PCI func to unreg SLI-4 device from PCI subsystem
11741 * SLI-4 interface spec. When an Emulex HBA with SLI-4 interface spec is
11749 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; in lpfc_pci_remove_one_s4()
11751 struct lpfc_hba *phba = vport->phba; in lpfc_pci_remove_one_s4()
11755 spin_lock_irq(&phba->hbalock); in lpfc_pci_remove_one_s4()
11756 vport->load_flag |= FC_UNLOADING; in lpfc_pci_remove_one_s4()
11757 spin_unlock_irq(&phba->hbalock); in lpfc_pci_remove_one_s4()
11765 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_pci_remove_one_s4()
11766 if (vports[i]->port_type == LPFC_PHYSICAL_PORT) in lpfc_pci_remove_one_s4()
11768 fc_vport_terminate(vports[i]->fc_vport); in lpfc_pci_remove_one_s4()
11792 spin_lock_irq(&phba->hbalock); in lpfc_pci_remove_one_s4()
11793 list_del_init(&vport->listentry); in lpfc_pci_remove_one_s4()
11794 spin_unlock_irq(&phba->hbalock); in lpfc_pci_remove_one_s4()
11820 * lpfc_pci_suspend_one_s4 - PCI func to suspend SLI-4 device for power mgmnt
11825 * Power Management (PM) to device with SLI-4 interface spec. When PM invokes
11829 * requirements to a power-aware driver's PM support for suspend/resume -- all
11837 * 0 - driver suspended the device
11844 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_suspend_one_s4()
11852 kthread_stop(phba->worker_thread); in lpfc_pci_suspend_one_s4()
11866 * lpfc_pci_resume_one_s4 - PCI func to resume SLI-4 device for power mgmnt
11870 * Power Management (PM) to device with SLI-4 interface spac. When PM invokes
11873 * implements the minimum PM requirements to a power-aware driver's PM for
11874 * suspend/resume -- all the possible PM messages (SUSPEND, HIBERNATE, FREEZE)
11881 * 0 - driver suspended the device
11888 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_resume_one_s4()
11905 if (pdev->is_busmaster) in lpfc_pci_resume_one_s4()
11909 phba->worker_thread = kthread_run(lpfc_do_work, phba, in lpfc_pci_resume_one_s4()
11910 "lpfc_worker_%d", phba->brd_no); in lpfc_pci_resume_one_s4()
11911 if (IS_ERR(phba->worker_thread)) { in lpfc_pci_resume_one_s4()
11912 error = PTR_ERR(phba->worker_thread); in lpfc_pci_resume_one_s4()
11920 intr_mode = lpfc_sli4_enable_intr(phba, phba->intr_mode); in lpfc_pci_resume_one_s4()
11924 return -EIO; in lpfc_pci_resume_one_s4()
11926 phba->intr_mode = intr_mode; in lpfc_pci_resume_one_s4()
11933 lpfc_log_intr_mode(phba, phba->intr_mode); in lpfc_pci_resume_one_s4()
11939 * lpfc_sli4_prep_dev_for_recover - Prepare SLI4 device for pci slot recover
11952 * and let the SCSI mid-layer to retry them to recover. in lpfc_sli4_prep_dev_for_recover()
11958 * lpfc_sli4_prep_dev_for_reset - Prepare SLI4 device for pci slot reset
11981 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) in lpfc_sli4_prep_dev_for_reset()
11990 pci_disable_device(phba->pcidev); in lpfc_sli4_prep_dev_for_reset()
11994 * lpfc_sli4_prep_dev_for_perm_failure - Prepare SLI4 dev for pci slot disable
12017 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) in lpfc_sli4_prep_dev_for_perm_failure()
12022 * lpfc_io_error_detected_s4 - Method for handling PCI I/O error to SLI-4 device
12027 * with SLI-4 interface spec. This function is called by the PCI subsystem
12034 * PCI_ERS_RESULT_NEED_RESET - need to reset before recovery
12035 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
12041 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_error_detected_s4()
12045 /* Non-fatal error, prepare for recovery */ in lpfc_io_error_detected_s4()
12066 * lpfc_io_slot_reset_s4 - Method for restart PCI SLI-4 device from scratch
12070 * with SLI-4 interface spec. It is called after PCI bus has been reset to
12071 * restart the PCI card from scratch, as if from a cold-boot. During the
12080 * PCI_ERS_RESULT_RECOVERED - the device has been recovered
12081 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
12087 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_slot_reset_s4()
12088 struct lpfc_sli *psli = &phba->sli; in lpfc_io_slot_reset_s4()
12091 dev_printk(KERN_INFO, &pdev->dev, "recovering from a slot reset.\n"); in lpfc_io_slot_reset_s4()
12093 printk(KERN_ERR "lpfc: Cannot re-enable " in lpfc_io_slot_reset_s4()
12106 if (pdev->is_busmaster) in lpfc_io_slot_reset_s4()
12109 spin_lock_irq(&phba->hbalock); in lpfc_io_slot_reset_s4()
12110 psli->sli_flag &= ~LPFC_SLI_ACTIVE; in lpfc_io_slot_reset_s4()
12111 spin_unlock_irq(&phba->hbalock); in lpfc_io_slot_reset_s4()
12114 intr_mode = lpfc_sli4_enable_intr(phba, phba->intr_mode); in lpfc_io_slot_reset_s4()
12117 "2824 Cannot re-enable interrupt after " in lpfc_io_slot_reset_s4()
12121 phba->intr_mode = intr_mode; in lpfc_io_slot_reset_s4()
12124 lpfc_log_intr_mode(phba, phba->intr_mode); in lpfc_io_slot_reset_s4()
12130 * lpfc_io_resume_s4 - Method for resuming PCI I/O operation to SLI-4 device
12134 * with SLI-4 interface spec. It is called when kernel error recovery tells
12143 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_resume_s4()
12151 if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) { in lpfc_io_resume_s4()
12161 if (phba->hba_flag & HBA_AER_ENABLED) in lpfc_io_resume_s4()
12166 * lpfc_pci_probe_one - lpfc PCI probe func to reg dev to PCI subsystem
12172 * at PCI device-specific information of the device and driver to see if the
12175 * the action to the proper SLI-3 or SLI-4 device probing routine, which will
12180 * 0 - driver can claim the device
12181 * negative value - driver can not claim the device
12190 return -ENODEV; in lpfc_pci_probe_one()
12202 * lpfc_pci_remove_one - lpfc PCI func to unreg dev from PCI subsystem
12207 * This routine dispatches the action to the proper SLI-3 or SLI-4 device
12215 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_remove_one()
12217 switch (phba->pci_dev_grp) { in lpfc_pci_remove_one()
12227 phba->pci_dev_grp); in lpfc_pci_remove_one()
12234 * lpfc_pci_suspend_one - lpfc PCI func to suspend dev for power management
12240 * the action to the proper SLI-3 or SLI-4 device suspend routine, which will
12244 * 0 - driver suspended the device
12251 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_suspend_one()
12252 int rc = -ENODEV; in lpfc_pci_suspend_one()
12254 switch (phba->pci_dev_grp) { in lpfc_pci_suspend_one()
12264 phba->pci_dev_grp); in lpfc_pci_suspend_one()
12271 * lpfc_pci_resume_one - lpfc PCI func to resume dev for power management
12276 * the action to the proper SLI-3 or SLI-4 device resume routine, which will
12280 * 0 - driver suspended the device
12287 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_pci_resume_one()
12288 int rc = -ENODEV; in lpfc_pci_resume_one()
12290 switch (phba->pci_dev_grp) { in lpfc_pci_resume_one()
12300 phba->pci_dev_grp); in lpfc_pci_resume_one()
12307 * lpfc_io_error_detected - lpfc method for handling PCI I/O error
12314 * the action to the proper SLI-3 or SLI-4 device error detected handling
12318 * PCI_ERS_RESULT_NEED_RESET - need to reset before recovery
12319 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
12325 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_error_detected()
12328 switch (phba->pci_dev_grp) { in lpfc_io_error_detected()
12338 phba->pci_dev_grp); in lpfc_io_error_detected()
12345 * lpfc_io_slot_reset - lpfc method for restart PCI dev from scratch
12350 * from scratch, as if from a cold-boot. When this routine is invoked, it
12351 * dispatches the action to the proper SLI-3 or SLI-4 device reset handling
12355 * PCI_ERS_RESULT_RECOVERED - the device has been recovered
12356 * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
12362 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_slot_reset()
12365 switch (phba->pci_dev_grp) { in lpfc_io_slot_reset()
12375 phba->pci_dev_grp); in lpfc_io_slot_reset()
12382 * lpfc_io_resume - lpfc method for resuming PCI I/O operation
12388 * this routine is invoked, it dispatches the action to the proper SLI-3
12389 * or SLI-4 device io_resume routine, which will resume the device operation.
12395 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; in lpfc_io_resume()
12397 switch (phba->pci_dev_grp) { in lpfc_io_resume()
12407 phba->pci_dev_grp); in lpfc_io_resume()
12414 * lpfc_sli4_oas_verify - Verify OAS is supported by this adapter
12427 if (!phba->cfg_EnableXLane) in lpfc_sli4_oas_verify()
12430 if (phba->sli4_hba.pc_sli4_params.oas_supported) { in lpfc_sli4_oas_verify()
12431 phba->cfg_fof = 1; in lpfc_sli4_oas_verify()
12433 phba->cfg_fof = 0; in lpfc_sli4_oas_verify()
12434 if (phba->device_data_mem_pool) in lpfc_sli4_oas_verify()
12435 mempool_destroy(phba->device_data_mem_pool); in lpfc_sli4_oas_verify()
12436 phba->device_data_mem_pool = NULL; in lpfc_sli4_oas_verify()
12443 * lpfc_fof_queue_setup - Set up all the fof queues
12450 * 0 - successful
12451 * -ENOMEM - No available memory
12459 rc = lpfc_eq_create(phba, phba->sli4_hba.fof_eq, LPFC_MAX_IMAX); in lpfc_fof_queue_setup()
12461 return -ENOMEM; in lpfc_fof_queue_setup()
12463 if (phba->cfg_fof) { in lpfc_fof_queue_setup()
12465 rc = lpfc_cq_create(phba, phba->sli4_hba.oas_cq, in lpfc_fof_queue_setup()
12466 phba->sli4_hba.fof_eq, LPFC_WCQ, LPFC_FCP); in lpfc_fof_queue_setup()
12470 rc = lpfc_wq_create(phba, phba->sli4_hba.oas_wq, in lpfc_fof_queue_setup()
12471 phba->sli4_hba.oas_cq, LPFC_FCP); in lpfc_fof_queue_setup()
12476 pring = phba->sli4_hba.oas_wq->pring; in lpfc_fof_queue_setup()
12477 pring->sli.sli4.wqp = in lpfc_fof_queue_setup()
12478 (void *)phba->sli4_hba.oas_wq; in lpfc_fof_queue_setup()
12479 phba->sli4_hba.oas_cq->pring = pring; in lpfc_fof_queue_setup()
12485 lpfc_cq_destroy(phba, phba->sli4_hba.oas_cq); in lpfc_fof_queue_setup()
12487 lpfc_eq_destroy(phba, phba->sli4_hba.fof_eq); in lpfc_fof_queue_setup()
12493 * lpfc_fof_queue_create - Create all the fof queues
12502 * 0 - successful
12503 * -ENOMEM - No availble memory
12504 * -EIO - The mailbox failed to complete successfully.
12514 phba->sli4_hba.eq_esize, in lpfc_fof_queue_create()
12515 phba->sli4_hba.eq_ecount); in lpfc_fof_queue_create()
12519 qdesc->qe_valid = 1; in lpfc_fof_queue_create()
12520 phba->sli4_hba.fof_eq = qdesc; in lpfc_fof_queue_create()
12522 if (phba->cfg_fof) { in lpfc_fof_queue_create()
12525 if (phba->enab_exp_wqcq_pages) in lpfc_fof_queue_create()
12528 phba->sli4_hba.cq_esize, in lpfc_fof_queue_create()
12533 phba->sli4_hba.cq_esize, in lpfc_fof_queue_create()
12534 phba->sli4_hba.cq_ecount); in lpfc_fof_queue_create()
12538 qdesc->qe_valid = 1; in lpfc_fof_queue_create()
12539 phba->sli4_hba.oas_cq = qdesc; in lpfc_fof_queue_create()
12542 if (phba->enab_exp_wqcq_pages) { in lpfc_fof_queue_create()
12543 wqesize = (phba->fcp_embed_io) ? in lpfc_fof_queue_create()
12544 LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize; in lpfc_fof_queue_create()
12552 phba->sli4_hba.wq_esize, in lpfc_fof_queue_create()
12553 phba->sli4_hba.wq_ecount); in lpfc_fof_queue_create()
12558 phba->sli4_hba.oas_wq = qdesc; in lpfc_fof_queue_create()
12559 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); in lpfc_fof_queue_create()
12566 return -ENOMEM; in lpfc_fof_queue_create()
12570 * lpfc_fof_queue_destroy - Destroy all the fof queues
12577 * 0 - successful
12583 if (phba->sli4_hba.fof_eq != NULL) { in lpfc_fof_queue_destroy()
12584 lpfc_sli4_queue_free(phba->sli4_hba.fof_eq); in lpfc_fof_queue_destroy()
12585 phba->sli4_hba.fof_eq = NULL; in lpfc_fof_queue_destroy()
12589 if (phba->sli4_hba.oas_cq != NULL) { in lpfc_fof_queue_destroy()
12590 lpfc_sli4_queue_free(phba->sli4_hba.oas_cq); in lpfc_fof_queue_destroy()
12591 phba->sli4_hba.oas_cq = NULL; in lpfc_fof_queue_destroy()
12595 if (phba->sli4_hba.oas_wq != NULL) { in lpfc_fof_queue_destroy()
12596 lpfc_sli4_queue_free(phba->sli4_hba.oas_wq); in lpfc_fof_queue_destroy()
12597 phba->sli4_hba.oas_wq = NULL; in lpfc_fof_queue_destroy()
12632 * lpfc_init - lpfc module initialization routine
12639 * 0 - successful
12640 * -ENOMEM - FC attach transport failed
12641 * all others - failed
12661 return -ENOMEM; in lpfc_init()
12666 return -ENOMEM; in lpfc_init()
12685 * lpfc_exit - lpfc module removal routine