Lines Matching +full:pci +full:- +full:domain

1 // SPDX-License-Identifier: GPL-2.0
15 struct efc *efc = nport->efc; in efc_nport_free_resources()
18 nport->attached = false; in efc_nport_free_resources()
21 if (nport->dma.virt) { in efc_nport_free_resources()
22 dma_free_coherent(&efc->pci->dev, nport->dma.size, in efc_nport_free_resources()
23 nport->dma.virt, nport->dma.phys); in efc_nport_free_resources()
24 memset(&nport->dma, 0, sizeof(struct efc_dma)); in efc_nport_free_resources()
28 sli_resource_free(efc->sli, SLI4_RSRC_VPI, nport->indicator); in efc_nport_free_resources()
36 struct efc *efc = nport->efc; in efc_nport_get_mbox_status()
40 if (status || le16_to_cpu(hdr->status)) { in efc_nport_get_mbox_status()
42 nport->indicator, status, le16_to_cpu(hdr->status)); in efc_nport_get_mbox_status()
43 return -EIO; in efc_nport_get_mbox_status()
67 struct efc *efc = nport->efc; in efc_nport_free_unreg_vpi()
71 rc = sli_cmd_unreg_vpi(efc->sli, data, nport->indicator, in efc_nport_free_unreg_vpi()
79 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_nport_free_unreg_vpi()
90 struct efc *efc = nport->efc; in efc_nport_send_evt()
97 nport->attached = true; in efc_nport_send_evt()
100 if (nport->free_req_pending) in efc_nport_send_evt()
111 return -EIO; in efc_nport_alloc_init_vpi_cb()
121 struct efc *efc = nport->efc; in efc_nport_alloc_init_vpi()
126 if (nport->free_req_pending) { in efc_nport_alloc_init_vpi()
131 rc = sli_cmd_init_vpi(efc->sli, data, in efc_nport_alloc_init_vpi()
132 nport->indicator, nport->domain->indicator); in efc_nport_alloc_init_vpi()
139 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_nport_alloc_init_vpi()
155 return -EIO; in efc_nport_alloc_read_sparm64_cb()
158 payload = nport->dma.virt; in efc_nport_alloc_read_sparm64_cb()
160 memcpy(&nport->sli_wwpn, payload + SLI4_READ_SPARM64_WWPN_OFFSET, in efc_nport_alloc_read_sparm64_cb()
161 sizeof(nport->sli_wwpn)); in efc_nport_alloc_read_sparm64_cb()
162 memcpy(&nport->sli_wwnn, payload + SLI4_READ_SPARM64_WWNN_OFFSET, in efc_nport_alloc_read_sparm64_cb()
163 sizeof(nport->sli_wwnn)); in efc_nport_alloc_read_sparm64_cb()
165 dma_free_coherent(&efc->pci->dev, nport->dma.size, nport->dma.virt, in efc_nport_alloc_read_sparm64_cb()
166 nport->dma.phys); in efc_nport_alloc_read_sparm64_cb()
167 memset(&nport->dma, 0, sizeof(struct efc_dma)); in efc_nport_alloc_read_sparm64_cb()
179 nport->dma.size = EFC_SPARAM_DMA_SZ; in efc_nport_alloc_read_sparm64()
180 nport->dma.virt = dma_alloc_coherent(&efc->pci->dev, in efc_nport_alloc_read_sparm64()
181 nport->dma.size, &nport->dma.phys, in efc_nport_alloc_read_sparm64()
183 if (!nport->dma.virt) { in efc_nport_alloc_read_sparm64()
189 rc = sli_cmd_read_sparm64(efc->sli, data, in efc_nport_alloc_read_sparm64()
190 &nport->dma, nport->indicator); in efc_nport_alloc_read_sparm64()
197 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_nport_alloc_read_sparm64()
207 struct efc_domain *domain, u8 *wwpn) in efc_cmd_nport_alloc() argument
211 nport->indicator = U32_MAX; in efc_cmd_nport_alloc()
212 nport->free_req_pending = false; in efc_cmd_nport_alloc()
215 memcpy(&nport->sli_wwpn, wwpn, sizeof(nport->sli_wwpn)); in efc_cmd_nport_alloc()
221 if (sli_resource_alloc(efc->sli, SLI4_RSRC_VPI, in efc_cmd_nport_alloc()
222 &nport->indicator, &index)) { in efc_cmd_nport_alloc()
224 return -EIO; in efc_cmd_nport_alloc()
227 if (domain) { in efc_cmd_nport_alloc()
237 /* domain NULL and wwpn non-NULL */ in efc_cmd_nport_alloc()
239 sli_resource_free(efc->sli, SLI4_RSRC_VPI, nport->indicator); in efc_cmd_nport_alloc()
240 return -EIO; in efc_cmd_nport_alloc()
252 nport->attaching = false; in efc_nport_attach_reg_vpi_cb()
255 return -EIO; in efc_nport_attach_reg_vpi_cb()
270 return -EIO; in efc_cmd_nport_attach()
273 nport->fc_id = fc_id; in efc_cmd_nport_attach()
275 /* register previously-allocated VPI with the device */ in efc_cmd_nport_attach()
276 rc = sli_cmd_reg_vpi(efc->sli, buf, nport->fc_id, in efc_cmd_nport_attach()
277 nport->sli_wwpn, nport->indicator, in efc_cmd_nport_attach()
278 nport->domain->indicator, false); in efc_cmd_nport_attach()
285 rc = efc->tt.issue_mbox_rqst(efc->base, buf, in efc_cmd_nport_attach()
291 nport->attaching = true; in efc_cmd_nport_attach()
302 return -EIO; in efc_cmd_nport_free()
306 if (nport->attached) in efc_cmd_nport_free()
308 else if (nport->attaching) in efc_cmd_nport_free()
309 nport->free_req_pending = true; in efc_cmd_nport_free()
311 efc_sm_post_event(&nport->sm, EFC_EVT_NPORT_FREE_OK, NULL); in efc_cmd_nport_free()
317 efc_domain_get_mbox_status(struct efc_domain *domain, u8 *mqe, int status) in efc_domain_get_mbox_status() argument
319 struct efc *efc = domain->efc; in efc_domain_get_mbox_status()
323 if (status || le16_to_cpu(hdr->status)) { in efc_domain_get_mbox_status()
325 domain->indicator, status, in efc_domain_get_mbox_status()
326 le16_to_cpu(hdr->status)); in efc_domain_get_mbox_status()
327 return -EIO; in efc_domain_get_mbox_status()
334 efc_domain_free_resources(struct efc_domain *domain, int evt, void *data) in efc_domain_free_resources() argument
336 struct efc *efc = domain->efc; in efc_domain_free_resources()
339 if (domain->dma.virt) { in efc_domain_free_resources()
340 dma_free_coherent(&efc->pci->dev, in efc_domain_free_resources()
341 domain->dma.size, domain->dma.virt, in efc_domain_free_resources()
342 domain->dma.phys); in efc_domain_free_resources()
343 memset(&domain->dma, 0, sizeof(struct efc_dma)); in efc_domain_free_resources()
347 sli_resource_free(efc->sli, SLI4_RSRC_VFI, domain->indicator); in efc_domain_free_resources()
349 efc_domain_cb(efc, evt, domain); in efc_domain_free_resources()
353 efc_domain_send_nport_evt(struct efc_domain *domain, in efc_domain_send_nport_evt() argument
356 struct efc *efc = domain->efc; in efc_domain_send_nport_evt()
359 efc_nport_send_evt(domain->nport, port_evt, NULL); in efc_domain_send_nport_evt()
362 efc_domain_cb(efc, domain_evt, domain); in efc_domain_send_nport_evt()
369 struct efc_domain *domain = arg; in efc_domain_alloc_read_sparm64_cb() local
371 if (efc_domain_get_mbox_status(domain, mqe, status)) { in efc_domain_alloc_read_sparm64_cb()
372 efc_domain_free_resources(domain, in efc_domain_alloc_read_sparm64_cb()
374 return -EIO; in efc_domain_alloc_read_sparm64_cb()
377 efc_domain_send_nport_evt(domain, EFC_EVT_NPORT_ALLOC_OK, in efc_domain_alloc_read_sparm64_cb()
383 efc_domain_alloc_read_sparm64(struct efc_domain *domain) in efc_domain_alloc_read_sparm64() argument
385 struct efc *efc = domain->efc; in efc_domain_alloc_read_sparm64()
389 rc = sli_cmd_read_sparm64(efc->sli, data, &domain->dma, 0); in efc_domain_alloc_read_sparm64()
392 efc_domain_free_resources(domain, in efc_domain_alloc_read_sparm64()
397 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_domain_alloc_read_sparm64()
398 efc_domain_alloc_read_sparm64_cb, domain); in efc_domain_alloc_read_sparm64()
401 efc_domain_free_resources(domain, in efc_domain_alloc_read_sparm64()
410 struct efc_domain *domain = arg; in efc_domain_alloc_init_vfi_cb() local
412 if (efc_domain_get_mbox_status(domain, mqe, status)) { in efc_domain_alloc_init_vfi_cb()
413 efc_domain_free_resources(domain, in efc_domain_alloc_init_vfi_cb()
415 return -EIO; in efc_domain_alloc_init_vfi_cb()
418 efc_domain_alloc_read_sparm64(domain); in efc_domain_alloc_init_vfi_cb()
423 efc_domain_alloc_init_vfi(struct efc_domain *domain) in efc_domain_alloc_init_vfi() argument
425 struct efc *efc = domain->efc; in efc_domain_alloc_init_vfi()
426 struct efc_nport *nport = domain->nport; in efc_domain_alloc_init_vfi()
432 * Copy FCF information into the domain and jump to INIT_VFI. in efc_domain_alloc_init_vfi()
434 domain->fcf_indicator = efc->fcfi; in efc_domain_alloc_init_vfi()
435 rc = sli_cmd_init_vfi(efc->sli, data, domain->indicator, in efc_domain_alloc_init_vfi()
436 domain->fcf_indicator, nport->indicator); in efc_domain_alloc_init_vfi()
439 efc_domain_free_resources(domain, in efc_domain_alloc_init_vfi()
445 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_domain_alloc_init_vfi()
446 efc_domain_alloc_init_vfi_cb, domain); in efc_domain_alloc_init_vfi()
449 efc_domain_free_resources(domain, in efc_domain_alloc_init_vfi()
455 efc_cmd_domain_alloc(struct efc *efc, struct efc_domain *domain, u32 fcf) in efc_cmd_domain_alloc() argument
459 if (!domain || !domain->nport) { in efc_cmd_domain_alloc()
460 efc_log_err(efc, "bad parameter(s) domain=%p nport=%p\n", in efc_cmd_domain_alloc()
461 domain, domain ? domain->nport : NULL); in efc_cmd_domain_alloc()
462 return -EIO; in efc_cmd_domain_alloc()
466 domain->dma.size = EFC_SPARAM_DMA_SZ; in efc_cmd_domain_alloc()
467 domain->dma.virt = dma_alloc_coherent(&efc->pci->dev, in efc_cmd_domain_alloc()
468 domain->dma.size, in efc_cmd_domain_alloc()
469 &domain->dma.phys, GFP_KERNEL); in efc_cmd_domain_alloc()
470 if (!domain->dma.virt) { in efc_cmd_domain_alloc()
472 return -EIO; in efc_cmd_domain_alloc()
475 domain->fcf = fcf; in efc_cmd_domain_alloc()
476 domain->fcf_indicator = U32_MAX; in efc_cmd_domain_alloc()
477 domain->indicator = U32_MAX; in efc_cmd_domain_alloc()
479 if (sli_resource_alloc(efc->sli, SLI4_RSRC_VFI, &domain->indicator, in efc_cmd_domain_alloc()
483 dma_free_coherent(&efc->pci->dev, in efc_cmd_domain_alloc()
484 domain->dma.size, domain->dma.virt, in efc_cmd_domain_alloc()
485 domain->dma.phys); in efc_cmd_domain_alloc()
486 memset(&domain->dma, 0, sizeof(struct efc_dma)); in efc_cmd_domain_alloc()
488 return -EIO; in efc_cmd_domain_alloc()
491 efc_domain_alloc_init_vfi(domain); in efc_cmd_domain_alloc()
499 struct efc_domain *domain = arg; in efc_domain_attach_reg_vfi_cb() local
501 if (efc_domain_get_mbox_status(domain, mqe, status)) { in efc_domain_attach_reg_vfi_cb()
502 efc_domain_free_resources(domain, in efc_domain_attach_reg_vfi_cb()
504 return -EIO; in efc_domain_attach_reg_vfi_cb()
507 efc_domain_send_nport_evt(domain, EFC_EVT_NPORT_ATTACH_OK, in efc_domain_attach_reg_vfi_cb()
513 efc_cmd_domain_attach(struct efc *efc, struct efc_domain *domain, u32 fc_id) in efc_cmd_domain_attach() argument
518 if (!domain) { in efc_cmd_domain_attach()
519 efc_log_err(efc, "bad param(s) domain=%p\n", domain); in efc_cmd_domain_attach()
520 return -EIO; in efc_cmd_domain_attach()
523 domain->nport->fc_id = fc_id; in efc_cmd_domain_attach()
525 rc = sli_cmd_reg_vfi(efc->sli, buf, SLI4_BMBX_SIZE, domain->indicator, in efc_cmd_domain_attach()
526 domain->fcf_indicator, domain->dma, in efc_cmd_domain_attach()
527 domain->nport->indicator, domain->nport->sli_wwpn, in efc_cmd_domain_attach()
528 domain->nport->fc_id); in efc_cmd_domain_attach()
534 rc = efc->tt.issue_mbox_rqst(efc->base, buf, in efc_cmd_domain_attach()
535 efc_domain_attach_reg_vfi_cb, domain); in efc_cmd_domain_attach()
544 efc_domain_free_resources(domain, EFC_HW_DOMAIN_ATTACH_FAIL, buf); in efc_cmd_domain_attach()
552 struct efc_domain *domain = arg; in efc_domain_free_unreg_vfi_cb() local
556 rc = efc_domain_get_mbox_status(domain, mqe, status); in efc_domain_free_unreg_vfi_cb()
559 rc = -EIO; in efc_domain_free_unreg_vfi_cb()
562 efc_domain_free_resources(domain, evt, mqe); in efc_domain_free_unreg_vfi_cb()
567 efc_domain_free_unreg_vfi(struct efc_domain *domain) in efc_domain_free_unreg_vfi() argument
569 struct efc *efc = domain->efc; in efc_domain_free_unreg_vfi()
573 rc = sli_cmd_unreg_vfi(efc->sli, data, domain->indicator, in efc_domain_free_unreg_vfi()
580 rc = efc->tt.issue_mbox_rqst(efc->base, data, in efc_domain_free_unreg_vfi()
581 efc_domain_free_unreg_vfi_cb, domain); in efc_domain_free_unreg_vfi()
590 efc_domain_free_resources(domain, EFC_HW_DOMAIN_FREE_FAIL, data); in efc_domain_free_unreg_vfi()
594 efc_cmd_domain_free(struct efc *efc, struct efc_domain *domain) in efc_cmd_domain_free() argument
596 if (!domain) { in efc_cmd_domain_free()
597 efc_log_err(efc, "bad parameter(s) domain=%p\n", domain); in efc_cmd_domain_free()
598 return -EIO; in efc_cmd_domain_free()
601 efc_domain_free_unreg_vfi(domain); in efc_cmd_domain_free()
610 if (rnode->indicator != U32_MAX) { in efc_cmd_node_alloc()
613 fc_addr, rnode->indicator); in efc_cmd_node_alloc()
614 return -EIO; in efc_cmd_node_alloc()
618 rnode->nport = NULL; in efc_cmd_node_alloc()
620 if (sli_resource_alloc(efc->sli, SLI4_RSRC_RPI, in efc_cmd_node_alloc()
621 &rnode->indicator, &rnode->index)) { in efc_cmd_node_alloc()
624 return -EIO; in efc_cmd_node_alloc()
627 rnode->fc_id = fc_addr; in efc_cmd_node_alloc()
628 rnode->nport = nport; in efc_cmd_node_alloc()
641 if (status || le16_to_cpu(hdr->status)) { in efc_cmd_node_attach_cb()
643 le16_to_cpu(hdr->status)); in efc_cmd_node_attach_cb()
644 rnode->attached = false; in efc_cmd_node_attach_cb()
647 rnode->attached = true; in efc_cmd_node_attach_cb()
660 int rc = -EIO; in efc_cmd_node_attach()
666 return -EIO; in efc_cmd_node_attach()
670 * If the attach count is non-zero, this RPI has already been reg'd. in efc_cmd_node_attach()
673 if (rnode->index == U32_MAX) { in efc_cmd_node_attach()
674 efc_log_err(efc, "bad parameter rnode->index invalid\n"); in efc_cmd_node_attach()
675 return -EIO; in efc_cmd_node_attach()
679 if (!sli_cmd_reg_rpi(efc->sli, buf, rnode->indicator, in efc_cmd_node_attach()
680 rnode->nport->indicator, rnode->fc_id, sparms, 0, 0)) in efc_cmd_node_attach()
681 rc = efc->tt.issue_mbox_rqst(efc->base, buf, in efc_cmd_node_attach()
694 return -EIO; in efc_node_free_resources()
697 if (rnode->nport) { in efc_node_free_resources()
698 if (rnode->attached) { in efc_node_free_resources()
700 return -EIO; in efc_node_free_resources()
702 if (rnode->indicator != U32_MAX) { in efc_node_free_resources()
703 if (sli_resource_free(efc->sli, SLI4_RSRC_RPI, in efc_node_free_resources()
704 rnode->indicator)) { in efc_node_free_resources()
707 rnode->indicator, rnode->fc_id); in efc_node_free_resources()
708 rc = -EIO; in efc_node_free_resources()
710 rnode->indicator = U32_MAX; in efc_node_free_resources()
711 rnode->index = U32_MAX; in efc_node_free_resources()
728 if (status || le16_to_cpu(hdr->status)) { in efc_cmd_node_free_cb()
730 le16_to_cpu(hdr->status)); in efc_cmd_node_free_cb()
733 * In certain cases, a non-zero MQE status is OK (all must be in efc_cmd_node_free_cb()
735 * - node is attached in efc_cmd_node_free_cb()
736 * - status is 0x1400 in efc_cmd_node_free_cb()
738 if (!rnode->attached || in efc_cmd_node_free_cb()
739 (le16_to_cpu(hdr->status) != SLI4_MBX_STATUS_RPI_NOT_REG)) in efc_cmd_node_free_cb()
740 rc = -EIO; in efc_cmd_node_free_cb()
744 rnode->attached = false; in efc_cmd_node_free_cb()
757 int rc = -EIO; in efc_cmd_node_detach()
761 return -EIO; in efc_cmd_node_detach()
764 if (rnode->nport) { in efc_cmd_node_detach()
765 if (!rnode->attached) in efc_cmd_node_detach()
766 return -EIO; in efc_cmd_node_detach()
768 rc = -EIO; in efc_cmd_node_detach()
770 if (!sli_cmd_unreg_rpi(efc->sli, buf, rnode->indicator, in efc_cmd_node_detach()
772 rc = efc->tt.issue_mbox_rqst(efc->base, buf, in efc_cmd_node_detach()
777 rc = -EIO; in efc_cmd_node_detach()