Lines Matching +full:ext +full:- +full:gen

4  * Copyright (C) 2017-2019 Broadcom. All Rights Reserved. The term *
6 * Copyright (C) 2009-2015 Emulex. All rights reserved. *
16 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
29 #include <linux/bsg-lib.h>
63 /* next two flags are here for the auto-delete logic */
85 uint8_t *ext; /* extended mailbox data */ member
130 (size_t)(&((struct lpfc_sli_ct_request *)NULL)->un)
144 list_for_each_entry_safe(mlast, next_mlast, &mlist->list, in lpfc_free_bsg_buffers()
146 lpfc_mbuf_free(phba, mlast->virt, mlast->phys); in lpfc_free_bsg_buffers()
147 list_del(&mlast->list); in lpfc_free_bsg_buffers()
150 lpfc_mbuf_free(phba, mlist->virt, mlist->phys); in lpfc_free_bsg_buffers()
183 INIT_LIST_HEAD(&mp->list); in lpfc_alloc_bsg_buffers()
184 mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys)); in lpfc_alloc_bsg_buffers()
186 if (!mp->virt) { in lpfc_alloc_bsg_buffers()
197 list_add_tail(&mp->list, &mlist->list); in lpfc_alloc_bsg_buffers()
201 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64; in lpfc_alloc_bsg_buffers()
203 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I; in lpfc_alloc_bsg_buffers()
204 bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys)); in lpfc_alloc_bsg_buffers()
205 bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys)); in lpfc_alloc_bsg_buffers()
206 bpl->tus.f.bdeSize = (uint16_t) in lpfc_alloc_bsg_buffers()
209 bytes_left -= bpl->tus.f.bdeSize; in lpfc_alloc_bsg_buffers()
210 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfc_alloc_bsg_buffers()
232 list_splice_init(&dma_buffers->list, &temp_list); in lpfc_bsg_copy_data()
233 list_add(&dma_buffers->list, &temp_list); in lpfc_bsg_copy_data()
239 sg_miter_start(&miter, bsg_buffers->sg_list, bsg_buffers->sg_cnt, in lpfc_bsg_copy_data()
247 dma_address = mp->virt + dma_offset; in lpfc_bsg_copy_data()
251 transfer_bytes = miter.length - sg_offset; in lpfc_bsg_copy_data()
258 if (transfer_bytes > (LPFC_BPL_SIZE - dma_offset)) in lpfc_bsg_copy_data()
259 transfer_bytes = LPFC_BPL_SIZE - dma_offset; in lpfc_bsg_copy_data()
266 bytes_to_transfer -= transfer_bytes; in lpfc_bsg_copy_data()
276 list_del_init(&dma_buffers->list); in lpfc_bsg_copy_data()
277 list_splice(&temp_list, &dma_buffers->list); in lpfc_bsg_copy_data()
282 * lpfc_bsg_send_mgmt_cmd_cmp - lpfc_bsg_send_mgmt_cmd's completion handler
314 dd_data = cmdiocbq->context1; in lpfc_bsg_send_mgmt_cmd_cmp()
317 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_send_mgmt_cmd_cmp()
318 job = dd_data->set_job; in lpfc_bsg_send_mgmt_cmd_cmp()
320 bsg_reply = job->reply; in lpfc_bsg_send_mgmt_cmd_cmp()
322 job->dd_data = NULL; in lpfc_bsg_send_mgmt_cmd_cmp()
324 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_send_mgmt_cmd_cmp()
327 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_send_mgmt_cmd_cmp()
328 cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING; in lpfc_bsg_send_mgmt_cmd_cmp()
329 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_send_mgmt_cmd_cmp()
331 iocb = &dd_data->context_un.iocb; in lpfc_bsg_send_mgmt_cmd_cmp()
332 ndlp = iocb->ndlp; in lpfc_bsg_send_mgmt_cmd_cmp()
333 rmp = iocb->rmp; in lpfc_bsg_send_mgmt_cmd_cmp()
334 cmp = cmdiocbq->context2; in lpfc_bsg_send_mgmt_cmd_cmp()
335 bmp = cmdiocbq->context3; in lpfc_bsg_send_mgmt_cmd_cmp()
336 rsp = &rspiocbq->iocb; in lpfc_bsg_send_mgmt_cmd_cmp()
341 if (rsp->ulpStatus) { in lpfc_bsg_send_mgmt_cmd_cmp()
342 if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) { in lpfc_bsg_send_mgmt_cmd_cmp()
343 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) { in lpfc_bsg_send_mgmt_cmd_cmp()
345 rc = -ETIMEDOUT; in lpfc_bsg_send_mgmt_cmd_cmp()
348 rc = -EFAULT; in lpfc_bsg_send_mgmt_cmd_cmp()
351 rc = -EACCES; in lpfc_bsg_send_mgmt_cmd_cmp()
355 rc = -EACCES; in lpfc_bsg_send_mgmt_cmd_cmp()
358 rsp_size = rsp->un.genreq64.bdl.bdeSize; in lpfc_bsg_send_mgmt_cmd_cmp()
359 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_send_mgmt_cmd_cmp()
360 lpfc_bsg_copy_data(rmp, &job->reply_payload, in lpfc_bsg_send_mgmt_cmd_cmp()
367 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_bsg_send_mgmt_cmd_cmp()
376 bsg_reply->result = rc; in lpfc_bsg_send_mgmt_cmd_cmp()
377 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_send_mgmt_cmd_cmp()
378 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_send_mgmt_cmd_cmp()
384 * lpfc_bsg_send_mgmt_cmd - send a CT command from a bsg request
391 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_send_mgmt_cmd()
392 struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data; in lpfc_bsg_send_mgmt_cmd()
393 struct lpfc_nodelist *ndlp = rdata->pnode; in lpfc_bsg_send_mgmt_cmd()
394 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_send_mgmt_cmd()
409 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_send_mgmt_cmd()
416 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
421 rc = -ENODEV; in lpfc_bsg_send_mgmt_cmd()
425 if (ndlp->nlp_flag & NLP_ELS_SND_MASK) { in lpfc_bsg_send_mgmt_cmd()
426 rc = -ENODEV; in lpfc_bsg_send_mgmt_cmd()
432 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
436 cmd = &cmdiocbq->iocb; in lpfc_bsg_send_mgmt_cmd()
440 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
443 bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys); in lpfc_bsg_send_mgmt_cmd()
444 if (!bmp->virt) { in lpfc_bsg_send_mgmt_cmd()
445 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
449 INIT_LIST_HEAD(&bmp->list); in lpfc_bsg_send_mgmt_cmd()
451 bpl = (struct ulp_bde64 *) bmp->virt; in lpfc_bsg_send_mgmt_cmd()
453 cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len, in lpfc_bsg_send_mgmt_cmd()
456 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
459 lpfc_bsg_copy_data(cmp, &job->request_payload, in lpfc_bsg_send_mgmt_cmd()
460 job->request_payload.payload_len, 1); in lpfc_bsg_send_mgmt_cmd()
463 reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg; in lpfc_bsg_send_mgmt_cmd()
464 rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0, in lpfc_bsg_send_mgmt_cmd()
467 rc = -ENOMEM; in lpfc_bsg_send_mgmt_cmd()
471 cmd->un.genreq64.bdl.ulpIoTag32 = 0; in lpfc_bsg_send_mgmt_cmd()
472 cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); in lpfc_bsg_send_mgmt_cmd()
473 cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); in lpfc_bsg_send_mgmt_cmd()
474 cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; in lpfc_bsg_send_mgmt_cmd()
475 cmd->un.genreq64.bdl.bdeSize = in lpfc_bsg_send_mgmt_cmd()
477 cmd->ulpCommand = CMD_GEN_REQUEST64_CR; in lpfc_bsg_send_mgmt_cmd()
478 cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA); in lpfc_bsg_send_mgmt_cmd()
479 cmd->un.genreq64.w5.hcsw.Dfctl = 0; in lpfc_bsg_send_mgmt_cmd()
480 cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL; in lpfc_bsg_send_mgmt_cmd()
481 cmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT; in lpfc_bsg_send_mgmt_cmd()
482 cmd->ulpBdeCount = 1; in lpfc_bsg_send_mgmt_cmd()
483 cmd->ulpLe = 1; in lpfc_bsg_send_mgmt_cmd()
484 cmd->ulpClass = CLASS3; in lpfc_bsg_send_mgmt_cmd()
485 cmd->ulpContext = ndlp->nlp_rpi; in lpfc_bsg_send_mgmt_cmd()
486 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_bsg_send_mgmt_cmd()
487 cmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]; in lpfc_bsg_send_mgmt_cmd()
488 cmd->ulpOwner = OWN_CHIP; in lpfc_bsg_send_mgmt_cmd()
489 cmdiocbq->vport = phba->pport; in lpfc_bsg_send_mgmt_cmd()
490 cmdiocbq->context3 = bmp; in lpfc_bsg_send_mgmt_cmd()
491 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; in lpfc_bsg_send_mgmt_cmd()
492 timeout = phba->fc_ratov * 2; in lpfc_bsg_send_mgmt_cmd()
493 cmd->ulpTimeout = timeout; in lpfc_bsg_send_mgmt_cmd()
495 cmdiocbq->iocb_cmpl = lpfc_bsg_send_mgmt_cmd_cmp; in lpfc_bsg_send_mgmt_cmd()
496 cmdiocbq->context1 = dd_data; in lpfc_bsg_send_mgmt_cmd()
497 cmdiocbq->context2 = cmp; in lpfc_bsg_send_mgmt_cmd()
498 cmdiocbq->context3 = bmp; in lpfc_bsg_send_mgmt_cmd()
499 cmdiocbq->context_un.ndlp = ndlp; in lpfc_bsg_send_mgmt_cmd()
500 dd_data->type = TYPE_IOCB; in lpfc_bsg_send_mgmt_cmd()
501 dd_data->set_job = job; in lpfc_bsg_send_mgmt_cmd()
502 dd_data->context_un.iocb.cmdiocbq = cmdiocbq; in lpfc_bsg_send_mgmt_cmd()
503 dd_data->context_un.iocb.ndlp = ndlp; in lpfc_bsg_send_mgmt_cmd()
504 dd_data->context_un.iocb.rmp = rmp; in lpfc_bsg_send_mgmt_cmd()
505 job->dd_data = dd_data; in lpfc_bsg_send_mgmt_cmd()
507 if (phba->cfg_poll & DISABLE_FCP_RING_INT) { in lpfc_bsg_send_mgmt_cmd()
508 if (lpfc_readl(phba->HCregaddr, &creg_val)) { in lpfc_bsg_send_mgmt_cmd()
509 rc = -EIO ; in lpfc_bsg_send_mgmt_cmd()
513 writel(creg_val, phba->HCregaddr); in lpfc_bsg_send_mgmt_cmd()
514 readl(phba->HCregaddr); /* flush */ in lpfc_bsg_send_mgmt_cmd()
520 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_send_mgmt_cmd()
522 if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) { in lpfc_bsg_send_mgmt_cmd()
524 cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING; in lpfc_bsg_send_mgmt_cmd()
526 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_send_mgmt_cmd()
529 rc = -EAGAIN; in lpfc_bsg_send_mgmt_cmd()
531 rc = -EIO; in lpfc_bsg_send_mgmt_cmd()
535 job->dd_data = NULL; in lpfc_bsg_send_mgmt_cmd()
542 if (bmp->virt) in lpfc_bsg_send_mgmt_cmd()
543 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_bsg_send_mgmt_cmd()
553 bsg_reply->result = rc; in lpfc_bsg_send_mgmt_cmd()
554 job->dd_data = NULL; in lpfc_bsg_send_mgmt_cmd()
559 * lpfc_bsg_rport_els_cmp - lpfc_bsg_rport_els's completion handler
592 dd_data = cmdiocbq->context1; in lpfc_bsg_rport_els_cmp()
593 ndlp = dd_data->context_un.iocb.ndlp; in lpfc_bsg_rport_els_cmp()
594 cmdiocbq->context1 = ndlp; in lpfc_bsg_rport_els_cmp()
597 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_rport_els_cmp()
598 job = dd_data->set_job; in lpfc_bsg_rport_els_cmp()
600 bsg_reply = job->reply; in lpfc_bsg_rport_els_cmp()
602 job->dd_data = NULL; in lpfc_bsg_rport_els_cmp()
604 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_rport_els_cmp()
607 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_rport_els_cmp()
608 cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING; in lpfc_bsg_rport_els_cmp()
609 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_rport_els_cmp()
611 rsp = &rspiocbq->iocb; in lpfc_bsg_rport_els_cmp()
612 pcmd = (struct lpfc_dmabuf *)cmdiocbq->context2; in lpfc_bsg_rport_els_cmp()
613 prsp = (struct lpfc_dmabuf *)pcmd->list.next; in lpfc_bsg_rport_els_cmp()
620 if (rsp->ulpStatus == IOSTAT_SUCCESS) { in lpfc_bsg_rport_els_cmp()
621 rsp_size = rsp->un.elsreq64.bdl.bdeSize; in lpfc_bsg_rport_els_cmp()
622 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_rport_els_cmp()
623 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_rport_els_cmp()
624 job->reply_payload.sg_cnt, in lpfc_bsg_rport_els_cmp()
625 prsp->virt, in lpfc_bsg_rport_els_cmp()
627 } else if (rsp->ulpStatus == IOSTAT_LS_RJT) { in lpfc_bsg_rport_els_cmp()
628 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_rport_els_cmp()
631 rjt_data = (uint8_t *)&rsp->un.ulpWord[4]; in lpfc_bsg_rport_els_cmp()
632 els_reply = &bsg_reply->reply_data.ctels_reply; in lpfc_bsg_rport_els_cmp()
633 els_reply->status = FC_CTELS_STATUS_REJECT; in lpfc_bsg_rport_els_cmp()
634 els_reply->rjt_data.action = rjt_data[3]; in lpfc_bsg_rport_els_cmp()
635 els_reply->rjt_data.reason_code = rjt_data[2]; in lpfc_bsg_rport_els_cmp()
636 els_reply->rjt_data.reason_explanation = rjt_data[1]; in lpfc_bsg_rport_els_cmp()
637 els_reply->rjt_data.vendor_unique = rjt_data[0]; in lpfc_bsg_rport_els_cmp()
639 rc = -EIO; in lpfc_bsg_rport_els_cmp()
650 bsg_reply->result = rc; in lpfc_bsg_rport_els_cmp()
651 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_rport_els_cmp()
652 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_rport_els_cmp()
658 * lpfc_bsg_rport_els - send an ELS command from a bsg request
665 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_rport_els()
666 struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data; in lpfc_bsg_rport_els()
667 struct lpfc_nodelist *ndlp = rdata->pnode; in lpfc_bsg_rport_els()
668 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_rport_els()
669 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_rport_els()
680 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_rport_els()
686 if (job->request_payload.payload_len > FCELSSIZE) { in lpfc_bsg_rport_els()
687 rc = -EINVAL; in lpfc_bsg_rport_els()
696 rc = -ENOMEM; in lpfc_bsg_rport_els()
700 elscmd = bsg_request->rqst_data.r_els.els_code; in lpfc_bsg_rport_els()
701 cmdsize = job->request_payload.payload_len; in lpfc_bsg_rport_els()
704 rc = -ENODEV; in lpfc_bsg_rport_els()
715 ndlp->nlp_DID, elscmd); in lpfc_bsg_rport_els()
717 rc = -EIO; in lpfc_bsg_rport_els()
721 rpi = ndlp->nlp_rpi; in lpfc_bsg_rport_els()
725 sg_copy_to_buffer(job->request_payload.sg_list, in lpfc_bsg_rport_els()
726 job->request_payload.sg_cnt, in lpfc_bsg_rport_els()
727 ((struct lpfc_dmabuf *)cmdiocbq->context2)->virt, in lpfc_bsg_rport_els()
730 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_bsg_rport_els()
731 cmdiocbq->iocb.ulpContext = phba->sli4_hba.rpi_ids[rpi]; in lpfc_bsg_rport_els()
733 cmdiocbq->iocb.ulpContext = rpi; in lpfc_bsg_rport_els()
734 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; in lpfc_bsg_rport_els()
735 cmdiocbq->context1 = dd_data; in lpfc_bsg_rport_els()
736 cmdiocbq->context_un.ndlp = ndlp; in lpfc_bsg_rport_els()
737 cmdiocbq->iocb_cmpl = lpfc_bsg_rport_els_cmp; in lpfc_bsg_rport_els()
738 dd_data->type = TYPE_IOCB; in lpfc_bsg_rport_els()
739 dd_data->set_job = job; in lpfc_bsg_rport_els()
740 dd_data->context_un.iocb.cmdiocbq = cmdiocbq; in lpfc_bsg_rport_els()
741 dd_data->context_un.iocb.ndlp = ndlp; in lpfc_bsg_rport_els()
742 dd_data->context_un.iocb.rmp = NULL; in lpfc_bsg_rport_els()
743 job->dd_data = dd_data; in lpfc_bsg_rport_els()
745 if (phba->cfg_poll & DISABLE_FCP_RING_INT) { in lpfc_bsg_rport_els()
746 if (lpfc_readl(phba->HCregaddr, &creg_val)) { in lpfc_bsg_rport_els()
747 rc = -EIO; in lpfc_bsg_rport_els()
751 writel(creg_val, phba->HCregaddr); in lpfc_bsg_rport_els()
752 readl(phba->HCregaddr); /* flush */ in lpfc_bsg_rport_els()
758 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_rport_els()
760 if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) { in lpfc_bsg_rport_els()
762 cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING; in lpfc_bsg_rport_els()
764 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_rport_els()
767 rc = -EAGAIN; in lpfc_bsg_rport_els()
769 rc = -EIO; in lpfc_bsg_rport_els()
773 job->dd_data = NULL; in lpfc_bsg_rport_els()
776 cmdiocbq->context1 = ndlp; in lpfc_bsg_rport_els()
787 bsg_reply->result = rc; in lpfc_bsg_rport_els()
788 job->dd_data = NULL; in lpfc_bsg_rport_els()
793 * lpfc_bsg_event_free - frees an allocated event structure
807 list_del(&evt->node); in lpfc_bsg_event_free()
809 while (!list_empty(&evt->events_to_get)) { in lpfc_bsg_event_free()
810 ed = list_entry(evt->events_to_get.next, typeof(*ed), node); in lpfc_bsg_event_free()
811 list_del(&ed->node); in lpfc_bsg_event_free()
812 kfree(ed->data); in lpfc_bsg_event_free()
816 while (!list_empty(&evt->events_to_see)) { in lpfc_bsg_event_free()
817 ed = list_entry(evt->events_to_see.next, typeof(*ed), node); in lpfc_bsg_event_free()
818 list_del(&ed->node); in lpfc_bsg_event_free()
819 kfree(ed->data); in lpfc_bsg_event_free()
823 kfree(evt->dd_data); in lpfc_bsg_event_free()
828 * lpfc_bsg_event_ref - increments the kref for an event
834 kref_get(&evt->kref); in lpfc_bsg_event_ref()
838 * lpfc_bsg_event_unref - Uses kref_put to free an event structure
844 kref_put(&evt->kref, lpfc_bsg_event_free); in lpfc_bsg_event_unref()
848 * lpfc_bsg_event_new - allocate and initialize a event structure
861 INIT_LIST_HEAD(&evt->events_to_get); in lpfc_bsg_event_new()
862 INIT_LIST_HEAD(&evt->events_to_see); in lpfc_bsg_event_new()
863 evt->type_mask = ev_mask; in lpfc_bsg_event_new()
864 evt->req_id = ev_req_id; in lpfc_bsg_event_new()
865 evt->reg_id = ev_reg_id; in lpfc_bsg_event_new()
866 evt->wait_time_stamp = jiffies; in lpfc_bsg_event_new()
867 evt->dd_data = NULL; in lpfc_bsg_event_new()
868 init_waitqueue_head(&evt->wq); in lpfc_bsg_event_new()
869 kref_init(&evt->kref); in lpfc_bsg_event_new()
874 * diag_cmd_data_free - Frees an lpfc dma buffer extension
886 (phba->link_flag & LS_LOOPBACK_MODE))) { in diag_cmd_data_free()
890 pcidev = phba->pcidev; in diag_cmd_data_free()
891 list_add_tail(&head, &mlist->dma.list); in diag_cmd_data_free()
895 if (mlast->dma.virt) in diag_cmd_data_free()
896 dma_free_coherent(&pcidev->dev, in diag_cmd_data_free()
897 mlast->size, in diag_cmd_data_free()
898 mlast->dma.virt, in diag_cmd_data_free()
899 mlast->dma.phys); in diag_cmd_data_free()
906 * lpfc_bsg_ct_unsol_event - process an unsolicited CT command
929 struct lpfc_dmabuf *bdeBuf1 = piocbq->context2; in lpfc_bsg_ct_unsol_event()
930 struct lpfc_dmabuf *bdeBuf2 = piocbq->context3; in lpfc_bsg_ct_unsol_event()
940 list_add_tail(&head, &piocbq->list); in lpfc_bsg_ct_unsol_event()
942 if (piocbq->iocb.ulpBdeCount == 0 || in lpfc_bsg_ct_unsol_event()
943 piocbq->iocb.un.cont64[0].tus.f.bdeSize == 0) in lpfc_bsg_ct_unsol_event()
946 if (phba->link_state == LPFC_HBA_ERROR || in lpfc_bsg_ct_unsol_event()
947 (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) in lpfc_bsg_ct_unsol_event()
950 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) in lpfc_bsg_ct_unsol_event()
953 dma_addr = getPaddr(piocbq->iocb.un.cont64[0].addrHigh, in lpfc_bsg_ct_unsol_event()
954 piocbq->iocb.un.cont64[0].addrLow); in lpfc_bsg_ct_unsol_event()
959 ct_req = (struct lpfc_sli_ct_request *)dmabuf->virt; in lpfc_bsg_ct_unsol_event()
960 evt_req_id = ct_req->FsType; in lpfc_bsg_ct_unsol_event()
961 cmd = ct_req->CommandResponse.bits.CmdRsp; in lpfc_bsg_ct_unsol_event()
962 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) in lpfc_bsg_ct_unsol_event()
965 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
966 list_for_each_entry(evt, &phba->ct_ev_waiters, node) { in lpfc_bsg_ct_unsol_event()
967 if (!(evt->type_mask & FC_REG_CT_EVENT) || in lpfc_bsg_ct_unsol_event()
968 evt->req_id != evt_req_id) in lpfc_bsg_ct_unsol_event()
972 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
975 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
983 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_bsg_ct_unsol_event()
986 evt_dat->len = iocbq->iocb.unsli3.rcvsli3.acc_len; in lpfc_bsg_ct_unsol_event()
989 for (i = 0; i < iocbq->iocb.ulpBdeCount; i++) in lpfc_bsg_ct_unsol_event()
990 evt_dat->len += in lpfc_bsg_ct_unsol_event()
991 iocbq->iocb.un.cont64[i].tus.f.bdeSize; in lpfc_bsg_ct_unsol_event()
995 evt_dat->data = kzalloc(evt_dat->len, GFP_KERNEL); in lpfc_bsg_ct_unsol_event()
996 if (evt_dat->data == NULL) { in lpfc_bsg_ct_unsol_event()
1000 evt_dat->len); in lpfc_bsg_ct_unsol_event()
1002 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1004 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1010 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_bsg_ct_unsol_event()
1011 bdeBuf1 = iocbq->context2; in lpfc_bsg_ct_unsol_event()
1012 bdeBuf2 = iocbq->context3; in lpfc_bsg_ct_unsol_event()
1014 for (i = 0; i < iocbq->iocb.ulpBdeCount; i++) { in lpfc_bsg_ct_unsol_event()
1015 if (phba->sli3_options & in lpfc_bsg_ct_unsol_event()
1019 &iocbq->iocb.un.ulpWord[0]; in lpfc_bsg_ct_unsol_event()
1020 size = hbqe->bde.tus.f.bdeSize; in lpfc_bsg_ct_unsol_event()
1024 &iocbq->iocb.unsli3. in lpfc_bsg_ct_unsol_event()
1026 size = hbqe->bde.tus.f.bdeSize; in lpfc_bsg_ct_unsol_event()
1029 if ((offset + size) > evt_dat->len) in lpfc_bsg_ct_unsol_event()
1030 size = evt_dat->len - offset; in lpfc_bsg_ct_unsol_event()
1032 size = iocbq->iocb.un.cont64[i]. in lpfc_bsg_ct_unsol_event()
1034 bde = &iocbq->iocb.un.cont64[i]; in lpfc_bsg_ct_unsol_event()
1035 dma_addr = getPaddr(bde->addrHigh, in lpfc_bsg_ct_unsol_event()
1036 bde->addrLow); in lpfc_bsg_ct_unsol_event()
1045 kfree(evt_dat->data); in lpfc_bsg_ct_unsol_event()
1047 spin_lock_irqsave(&phba->ct_ev_lock, in lpfc_bsg_ct_unsol_event()
1051 &phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1054 memcpy((char *)(evt_dat->data) + offset, in lpfc_bsg_ct_unsol_event()
1055 dmabuf->virt, size); in lpfc_bsg_ct_unsol_event()
1058 !(phba->sli3_options & in lpfc_bsg_ct_unsol_event()
1065 if (phba->sli_rev < in lpfc_bsg_ct_unsol_event()
1072 if ((phba->sli_rev == in lpfc_bsg_ct_unsol_event()
1074 (phba->sli3_options & in lpfc_bsg_ct_unsol_event()
1086 if (!(phba->sli3_options & in lpfc_bsg_ct_unsol_event()
1097 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1098 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_bsg_ct_unsol_event()
1099 evt_dat->immed_dat = phba->ctx_idx; in lpfc_bsg_ct_unsol_event()
1100 phba->ctx_idx = (phba->ctx_idx + 1) % LPFC_CT_CTX_MAX; in lpfc_bsg_ct_unsol_event()
1101 /* Provide warning for over-run of the ct_ctx array */ in lpfc_bsg_ct_unsol_event()
1102 if (phba->ct_ctx[evt_dat->immed_dat].valid == in lpfc_bsg_ct_unsol_event()
1106 "[%d] over-run: oxid:x%x, " in lpfc_bsg_ct_unsol_event()
1107 "sid:x%x\n", phba->ctx_idx, in lpfc_bsg_ct_unsol_event()
1108 phba->ct_ctx[ in lpfc_bsg_ct_unsol_event()
1109 evt_dat->immed_dat].oxid, in lpfc_bsg_ct_unsol_event()
1110 phba->ct_ctx[ in lpfc_bsg_ct_unsol_event()
1111 evt_dat->immed_dat].SID); in lpfc_bsg_ct_unsol_event()
1112 phba->ct_ctx[evt_dat->immed_dat].rxid = in lpfc_bsg_ct_unsol_event()
1113 piocbq->iocb.ulpContext; in lpfc_bsg_ct_unsol_event()
1114 phba->ct_ctx[evt_dat->immed_dat].oxid = in lpfc_bsg_ct_unsol_event()
1115 piocbq->iocb.unsli3.rcvsli3.ox_id; in lpfc_bsg_ct_unsol_event()
1116 phba->ct_ctx[evt_dat->immed_dat].SID = in lpfc_bsg_ct_unsol_event()
1117 piocbq->iocb.un.rcvels.remoteID; in lpfc_bsg_ct_unsol_event()
1118 phba->ct_ctx[evt_dat->immed_dat].valid = UNSOL_VALID; in lpfc_bsg_ct_unsol_event()
1120 evt_dat->immed_dat = piocbq->iocb.ulpContext; in lpfc_bsg_ct_unsol_event()
1122 evt_dat->type = FC_REG_CT_EVENT; in lpfc_bsg_ct_unsol_event()
1123 list_add(&evt_dat->node, &evt->events_to_see); in lpfc_bsg_ct_unsol_event()
1125 wake_up_interruptible(&evt->wq); in lpfc_bsg_ct_unsol_event()
1130 list_move(evt->events_to_see.prev, &evt->events_to_get); in lpfc_bsg_ct_unsol_event()
1132 dd_data = (struct bsg_job_data *)evt->dd_data; in lpfc_bsg_ct_unsol_event()
1133 job = dd_data->set_job; in lpfc_bsg_ct_unsol_event()
1134 dd_data->set_job = NULL; in lpfc_bsg_ct_unsol_event()
1137 bsg_reply = job->reply; in lpfc_bsg_ct_unsol_event()
1138 bsg_reply->reply_payload_rcv_len = size; in lpfc_bsg_ct_unsol_event()
1140 bsg_reply->result = 0; in lpfc_bsg_ct_unsol_event()
1141 job->dd_data = NULL; in lpfc_bsg_ct_unsol_event()
1143 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1144 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_ct_unsol_event()
1145 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_ct_unsol_event()
1146 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1149 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_ct_unsol_event()
1154 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_bsg_ct_unsol_event()
1161 * lpfc_bsg_ct_unsol_abort - handler ct abort to management plane
1181 memcpy(fc_hdr_ptr, dmabuf->hbuf.virt, sizeof(struct fc_frame_header)); in lpfc_bsg_ct_unsol_abort()
1183 oxid = be16_to_cpu(fc_hdr_ptr->fh_ox_id); in lpfc_bsg_ct_unsol_abort()
1184 rxid = be16_to_cpu(fc_hdr_ptr->fh_rx_id); in lpfc_bsg_ct_unsol_abort()
1187 if (phba->ct_ctx[ctx_idx].valid != UNSOL_VALID) in lpfc_bsg_ct_unsol_abort()
1189 if (phba->ct_ctx[ctx_idx].rxid != rxid) in lpfc_bsg_ct_unsol_abort()
1191 if (phba->ct_ctx[ctx_idx].oxid != oxid) in lpfc_bsg_ct_unsol_abort()
1193 if (phba->ct_ctx[ctx_idx].SID != sid) in lpfc_bsg_ct_unsol_abort()
1195 phba->ct_ctx[ctx_idx].valid = UNSOL_INVALID; in lpfc_bsg_ct_unsol_abort()
1202 * lpfc_bsg_hba_set_event - process a SET_EVENT bsg vendor command
1209 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_hba_set_event()
1210 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_hba_set_event()
1218 if (job->request_len < in lpfc_bsg_hba_set_event()
1223 rc = -EINVAL; in lpfc_bsg_hba_set_event()
1228 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_hba_set_event()
1229 ev_mask = ((uint32_t)(unsigned long)event_req->type_mask & in lpfc_bsg_hba_set_event()
1231 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1232 list_for_each_entry(evt, &phba->ct_ev_waiters, node) { in lpfc_bsg_hba_set_event()
1233 if (evt->reg_id == event_req->ev_reg_id) { in lpfc_bsg_hba_set_event()
1235 evt->wait_time_stamp = jiffies; in lpfc_bsg_hba_set_event()
1236 dd_data = (struct bsg_job_data *)evt->dd_data; in lpfc_bsg_hba_set_event()
1240 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1242 if (&evt->node == &phba->ct_ev_waiters) { in lpfc_bsg_hba_set_event()
1243 /* no event waiting struct yet - first call */ in lpfc_bsg_hba_set_event()
1248 rc = -ENOMEM; in lpfc_bsg_hba_set_event()
1251 evt = lpfc_bsg_event_new(ev_mask, event_req->ev_reg_id, in lpfc_bsg_hba_set_event()
1252 event_req->ev_req_id); in lpfc_bsg_hba_set_event()
1257 rc = -ENOMEM; in lpfc_bsg_hba_set_event()
1260 dd_data->type = TYPE_EVT; in lpfc_bsg_hba_set_event()
1261 dd_data->set_job = NULL; in lpfc_bsg_hba_set_event()
1262 dd_data->context_un.evt = evt; in lpfc_bsg_hba_set_event()
1263 evt->dd_data = (void *)dd_data; in lpfc_bsg_hba_set_event()
1264 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1265 list_add(&evt->node, &phba->ct_ev_waiters); in lpfc_bsg_hba_set_event()
1267 evt->wait_time_stamp = jiffies; in lpfc_bsg_hba_set_event()
1268 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1271 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1272 evt->waiting = 1; in lpfc_bsg_hba_set_event()
1273 dd_data->set_job = job; /* for unsolicited command */ in lpfc_bsg_hba_set_event()
1274 job->dd_data = dd_data; /* for fc transport timeout callback*/ in lpfc_bsg_hba_set_event()
1275 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_set_event()
1280 job->dd_data = NULL; in lpfc_bsg_hba_set_event()
1285 * lpfc_bsg_hba_get_event - process a GET_EVENT bsg vendor command
1292 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_hba_get_event()
1293 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_hba_get_event()
1294 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_hba_get_event()
1302 if (job->request_len < in lpfc_bsg_hba_get_event()
1307 rc = -EINVAL; in lpfc_bsg_hba_get_event()
1312 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_hba_get_event()
1315 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_bsg_hba_get_event()
1316 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_get_event()
1317 list_for_each_entry_safe(evt, evt_next, &phba->ct_ev_waiters, node) { in lpfc_bsg_hba_get_event()
1318 if (evt->reg_id == event_req->ev_reg_id) { in lpfc_bsg_hba_get_event()
1319 if (list_empty(&evt->events_to_get)) in lpfc_bsg_hba_get_event()
1322 evt->wait_time_stamp = jiffies; in lpfc_bsg_hba_get_event()
1323 evt_dat = list_entry(evt->events_to_get.prev, in lpfc_bsg_hba_get_event()
1325 list_del(&evt_dat->node); in lpfc_bsg_hba_get_event()
1329 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_get_event()
1335 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_hba_get_event()
1336 rc = -ENOENT; in lpfc_bsg_hba_get_event()
1340 if (evt_dat->len > job->request_payload.payload_len) { in lpfc_bsg_hba_get_event()
1341 evt_dat->len = job->request_payload.payload_len; in lpfc_bsg_hba_get_event()
1345 job->request_payload.payload_len); in lpfc_bsg_hba_get_event()
1348 event_reply->type = evt_dat->type; in lpfc_bsg_hba_get_event()
1349 event_reply->immed_data = evt_dat->immed_dat; in lpfc_bsg_hba_get_event()
1350 if (evt_dat->len > 0) in lpfc_bsg_hba_get_event()
1351 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_hba_get_event()
1352 sg_copy_from_buffer(job->request_payload.sg_list, in lpfc_bsg_hba_get_event()
1353 job->request_payload.sg_cnt, in lpfc_bsg_hba_get_event()
1354 evt_dat->data, evt_dat->len); in lpfc_bsg_hba_get_event()
1356 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_hba_get_event()
1359 kfree(evt_dat->data); in lpfc_bsg_hba_get_event()
1363 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_get_event()
1365 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_hba_get_event()
1366 job->dd_data = NULL; in lpfc_bsg_hba_get_event()
1367 bsg_reply->result = 0; in lpfc_bsg_hba_get_event()
1368 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_hba_get_event()
1369 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_hba_get_event()
1373 job->dd_data = NULL; in lpfc_bsg_hba_get_event()
1374 bsg_reply->result = rc; in lpfc_bsg_hba_get_event()
1379 * lpfc_issue_ct_rsp_cmp - lpfc_issue_ct_rsp's completion handler
1409 dd_data = cmdiocbq->context1; in lpfc_issue_ct_rsp_cmp()
1412 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_issue_ct_rsp_cmp()
1413 job = dd_data->set_job; in lpfc_issue_ct_rsp_cmp()
1416 job->dd_data = NULL; in lpfc_issue_ct_rsp_cmp()
1418 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_issue_ct_rsp_cmp()
1421 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_issue_ct_rsp_cmp()
1422 cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING; in lpfc_issue_ct_rsp_cmp()
1423 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_issue_ct_rsp_cmp()
1425 ndlp = dd_data->context_un.iocb.ndlp; in lpfc_issue_ct_rsp_cmp()
1426 cmp = cmdiocbq->context2; in lpfc_issue_ct_rsp_cmp()
1427 bmp = cmdiocbq->context3; in lpfc_issue_ct_rsp_cmp()
1428 rsp = &rspiocbq->iocb; in lpfc_issue_ct_rsp_cmp()
1433 bsg_reply = job->reply; in lpfc_issue_ct_rsp_cmp()
1434 if (rsp->ulpStatus) { in lpfc_issue_ct_rsp_cmp()
1435 if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) { in lpfc_issue_ct_rsp_cmp()
1436 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) { in lpfc_issue_ct_rsp_cmp()
1438 rc = -ETIMEDOUT; in lpfc_issue_ct_rsp_cmp()
1441 rc = -EFAULT; in lpfc_issue_ct_rsp_cmp()
1444 rc = -EACCES; in lpfc_issue_ct_rsp_cmp()
1448 rc = -EACCES; in lpfc_issue_ct_rsp_cmp()
1451 bsg_reply->reply_payload_rcv_len = 0; in lpfc_issue_ct_rsp_cmp()
1456 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_issue_ct_rsp_cmp()
1465 bsg_reply->result = rc; in lpfc_issue_ct_rsp_cmp()
1466 bsg_job_done(job, bsg_reply->result, in lpfc_issue_ct_rsp_cmp()
1467 bsg_reply->reply_payload_rcv_len); in lpfc_issue_ct_rsp_cmp()
1473 * lpfc_issue_ct_rsp - issue a ct response
1498 rc = -ENOMEM; in lpfc_issue_ct_rsp()
1505 rc = -ENOMEM; in lpfc_issue_ct_rsp()
1509 icmd = &ctiocb->iocb; in lpfc_issue_ct_rsp()
1510 icmd->un.xseq64.bdl.ulpIoTag32 = 0; in lpfc_issue_ct_rsp()
1511 icmd->un.xseq64.bdl.addrHigh = putPaddrHigh(bmp->phys); in lpfc_issue_ct_rsp()
1512 icmd->un.xseq64.bdl.addrLow = putPaddrLow(bmp->phys); in lpfc_issue_ct_rsp()
1513 icmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; in lpfc_issue_ct_rsp()
1514 icmd->un.xseq64.bdl.bdeSize = (num_entry * sizeof(struct ulp_bde64)); in lpfc_issue_ct_rsp()
1515 icmd->un.xseq64.w5.hcsw.Fctl = (LS | LA); in lpfc_issue_ct_rsp()
1516 icmd->un.xseq64.w5.hcsw.Dfctl = 0; in lpfc_issue_ct_rsp()
1517 icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_SOL_CTL; in lpfc_issue_ct_rsp()
1518 icmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT; in lpfc_issue_ct_rsp()
1521 icmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX; in lpfc_issue_ct_rsp()
1522 icmd->ulpBdeCount = 1; in lpfc_issue_ct_rsp()
1523 icmd->ulpLe = 1; in lpfc_issue_ct_rsp()
1524 icmd->ulpClass = CLASS3; in lpfc_issue_ct_rsp()
1525 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_ct_rsp()
1527 if (phba->ct_ctx[tag].valid != UNSOL_VALID) { in lpfc_issue_ct_rsp()
1531 icmd->ulpContext = phba->ct_ctx[tag].rxid; in lpfc_issue_ct_rsp()
1532 icmd->unsli3.rcvsli3.ox_id = phba->ct_ctx[tag].oxid; in lpfc_issue_ct_rsp()
1533 ndlp = lpfc_findnode_did(phba->pport, phba->ct_ctx[tag].SID); in lpfc_issue_ct_rsp()
1537 icmd->ulpContext, in lpfc_issue_ct_rsp()
1538 phba->ct_ctx[tag].SID); in lpfc_issue_ct_rsp()
1557 icmd->un.ulpWord[3] = in lpfc_issue_ct_rsp()
1558 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]; in lpfc_issue_ct_rsp()
1561 phba->ct_ctx[tag].valid = UNSOL_INVALID; in lpfc_issue_ct_rsp()
1563 icmd->ulpContext = (ushort) tag; in lpfc_issue_ct_rsp()
1565 icmd->ulpTimeout = phba->fc_ratov * 2; in lpfc_issue_ct_rsp()
1570 icmd->ulpContext, icmd->ulpIoTag, tag, phba->link_state); in lpfc_issue_ct_rsp()
1572 ctiocb->iocb_flag |= LPFC_IO_LIBDFC; in lpfc_issue_ct_rsp()
1573 ctiocb->vport = phba->pport; in lpfc_issue_ct_rsp()
1574 ctiocb->context1 = dd_data; in lpfc_issue_ct_rsp()
1575 ctiocb->context2 = cmp; in lpfc_issue_ct_rsp()
1576 ctiocb->context3 = bmp; in lpfc_issue_ct_rsp()
1577 ctiocb->context_un.ndlp = ndlp; in lpfc_issue_ct_rsp()
1578 ctiocb->iocb_cmpl = lpfc_issue_ct_rsp_cmp; in lpfc_issue_ct_rsp()
1580 dd_data->type = TYPE_IOCB; in lpfc_issue_ct_rsp()
1581 dd_data->set_job = job; in lpfc_issue_ct_rsp()
1582 dd_data->context_un.iocb.cmdiocbq = ctiocb; in lpfc_issue_ct_rsp()
1583 dd_data->context_un.iocb.ndlp = ndlp; in lpfc_issue_ct_rsp()
1584 dd_data->context_un.iocb.rmp = NULL; in lpfc_issue_ct_rsp()
1585 job->dd_data = dd_data; in lpfc_issue_ct_rsp()
1587 if (phba->cfg_poll & DISABLE_FCP_RING_INT) { in lpfc_issue_ct_rsp()
1588 if (lpfc_readl(phba->HCregaddr, &creg_val)) { in lpfc_issue_ct_rsp()
1589 rc = -IOCB_ERROR; in lpfc_issue_ct_rsp()
1593 writel(creg_val, phba->HCregaddr); in lpfc_issue_ct_rsp()
1594 readl(phba->HCregaddr); /* flush */ in lpfc_issue_ct_rsp()
1600 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_issue_ct_rsp()
1602 if (ctiocb->iocb_flag & LPFC_IO_LIBDFC) { in lpfc_issue_ct_rsp()
1604 ctiocb->iocb_flag |= LPFC_IO_CMD_OUTSTANDING; in lpfc_issue_ct_rsp()
1606 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_issue_ct_rsp()
1611 job->dd_data = NULL; in lpfc_issue_ct_rsp()
1622 * lpfc_bsg_send_mgmt_rsp - process a SEND_MGMT_RESP bsg vendor command
1629 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_send_mgmt_rsp()
1630 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_send_mgmt_rsp()
1631 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_send_mgmt_rsp()
1633 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_send_mgmt_rsp()
1637 uint32_t tag = mgmt_resp->tag; in lpfc_bsg_send_mgmt_rsp()
1639 (unsigned long)job->request_payload.payload_len; in lpfc_bsg_send_mgmt_rsp()
1643 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_send_mgmt_rsp()
1646 rc = -ERANGE; in lpfc_bsg_send_mgmt_rsp()
1652 rc = -ENOMEM; in lpfc_bsg_send_mgmt_rsp()
1656 bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys); in lpfc_bsg_send_mgmt_rsp()
1657 if (!bmp->virt) { in lpfc_bsg_send_mgmt_rsp()
1658 rc = -ENOMEM; in lpfc_bsg_send_mgmt_rsp()
1662 INIT_LIST_HEAD(&bmp->list); in lpfc_bsg_send_mgmt_rsp()
1663 bpl = (struct ulp_bde64 *) bmp->virt; in lpfc_bsg_send_mgmt_rsp()
1665 cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len, in lpfc_bsg_send_mgmt_rsp()
1668 rc = -ENOMEM; in lpfc_bsg_send_mgmt_rsp()
1671 lpfc_bsg_copy_data(cmp, &job->request_payload, in lpfc_bsg_send_mgmt_rsp()
1672 job->request_payload.payload_len, 1); in lpfc_bsg_send_mgmt_rsp()
1679 rc = -EACCES; in lpfc_bsg_send_mgmt_rsp()
1684 if (bmp->virt) in lpfc_bsg_send_mgmt_rsp()
1685 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_bsg_send_mgmt_rsp()
1689 bsg_reply->result = rc; in lpfc_bsg_send_mgmt_rsp()
1690 job->dd_data = NULL; in lpfc_bsg_send_mgmt_rsp()
1695 * lpfc_bsg_diag_mode_enter - process preparing into device diag loopback mode
1711 psli = &phba->sli; in lpfc_bsg_diag_mode_enter()
1713 return -ENODEV; in lpfc_bsg_diag_mode_enter()
1716 if ((phba->link_state == LPFC_HBA_ERROR) || in lpfc_bsg_diag_mode_enter()
1717 (psli->sli_flag & LPFC_BLOCK_MGMT_IO) || in lpfc_bsg_diag_mode_enter()
1718 (!(psli->sli_flag & LPFC_SLI_ACTIVE))) in lpfc_bsg_diag_mode_enter()
1719 return -EACCES; in lpfc_bsg_diag_mode_enter()
1723 for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { in lpfc_bsg_diag_mode_enter()
1729 shost = lpfc_shost_from_vport(phba->pport); in lpfc_bsg_diag_mode_enter()
1733 if (phba->sli_rev != LPFC_SLI_REV4) { in lpfc_bsg_diag_mode_enter()
1734 pring = &psli->sli3_ring[LPFC_FCP_RING]; in lpfc_bsg_diag_mode_enter()
1735 lpfc_emptyq_wait(phba, &pring->txcmplq, &phba->hbalock); in lpfc_bsg_diag_mode_enter()
1738 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) { in lpfc_bsg_diag_mode_enter()
1739 pring = qp->pring; in lpfc_bsg_diag_mode_enter()
1740 if (!pring || (pring->ringno != LPFC_FCP_RING)) in lpfc_bsg_diag_mode_enter()
1742 if (!lpfc_emptyq_wait(phba, &pring->txcmplq, in lpfc_bsg_diag_mode_enter()
1743 &pring->ring_lock)) in lpfc_bsg_diag_mode_enter()
1750 * lpfc_bsg_diag_mode_exit - exit process from device diag loopback mode
1765 for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { in lpfc_bsg_diag_mode_exit()
1771 shost = lpfc_shost_from_vport(phba->pport); in lpfc_bsg_diag_mode_exit()
1778 * lpfc_sli3_bsg_diag_loopback_mode - process an sli3 bsg vendor command
1787 * so the scsi mid-layer doesn't give up on the port.
1788 * All of this is done in-line.
1793 struct fc_bsg_request *bsg_request = job->request; in lpfc_sli3_bsg_diag_loopback_mode()
1794 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_sli3_bsg_diag_loopback_mode()
1804 bsg_reply->reply_payload_rcv_len = 0; in lpfc_sli3_bsg_diag_loopback_mode()
1806 if (job->request_len < sizeof(struct fc_bsg_request) + in lpfc_sli3_bsg_diag_loopback_mode()
1811 job->request_len, in lpfc_sli3_bsg_diag_loopback_mode()
1814 rc = -EINVAL; in lpfc_sli3_bsg_diag_loopback_mode()
1824 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_sli3_bsg_diag_loopback_mode()
1825 link_flags = loopback_mode->type; in lpfc_sli3_bsg_diag_loopback_mode()
1826 timeout = loopback_mode->timeout * 100; in lpfc_sli3_bsg_diag_loopback_mode()
1828 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli3_bsg_diag_loopback_mode()
1830 rc = -ENOMEM; in lpfc_sli3_bsg_diag_loopback_mode()
1834 pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK; in lpfc_sli3_bsg_diag_loopback_mode()
1835 pmboxq->u.mb.mbxOwner = OWN_HOST; in lpfc_sli3_bsg_diag_loopback_mode()
1839 if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0)) { in lpfc_sli3_bsg_diag_loopback_mode()
1842 while (phba->link_state != LPFC_LINK_DOWN) { in lpfc_sli3_bsg_diag_loopback_mode()
1844 rc = -ETIMEDOUT; in lpfc_sli3_bsg_diag_loopback_mode()
1852 pmboxq->u.mb.un.varInitLnk.link_flags = FLAGS_LOCAL_LB; in lpfc_sli3_bsg_diag_loopback_mode()
1854 pmboxq->u.mb.un.varInitLnk.link_flags = in lpfc_sli3_bsg_diag_loopback_mode()
1857 pmboxq->u.mb.mbxCommand = MBX_INIT_LINK; in lpfc_sli3_bsg_diag_loopback_mode()
1858 pmboxq->u.mb.mbxOwner = OWN_HOST; in lpfc_sli3_bsg_diag_loopback_mode()
1863 if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) in lpfc_sli3_bsg_diag_loopback_mode()
1864 rc = -ENODEV; in lpfc_sli3_bsg_diag_loopback_mode()
1866 spin_lock_irq(&phba->hbalock); in lpfc_sli3_bsg_diag_loopback_mode()
1867 phba->link_flag |= LS_LOOPBACK_MODE; in lpfc_sli3_bsg_diag_loopback_mode()
1868 spin_unlock_irq(&phba->hbalock); in lpfc_sli3_bsg_diag_loopback_mode()
1873 while (phba->link_state != LPFC_HBA_READY) { in lpfc_sli3_bsg_diag_loopback_mode()
1875 rc = -ETIMEDOUT; in lpfc_sli3_bsg_diag_loopback_mode()
1884 rc = -ENODEV; in lpfc_sli3_bsg_diag_loopback_mode()
1893 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_sli3_bsg_diag_loopback_mode()
1897 bsg_reply->result = rc; in lpfc_sli3_bsg_diag_loopback_mode()
1900 bsg_job_done(job, bsg_reply->result, in lpfc_sli3_bsg_diag_loopback_mode()
1901 bsg_reply->reply_payload_rcv_len); in lpfc_sli3_bsg_diag_loopback_mode()
1906 * lpfc_sli4_bsg_set_link_diag_state - set sli4 link diag state
1921 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_bsg_set_link_diag_state()
1923 return -ENOMEM; in lpfc_sli4_bsg_set_link_diag_state()
1925 req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) - in lpfc_sli4_bsg_set_link_diag_state()
1931 rc = -ENOMEM; in lpfc_sli4_bsg_set_link_diag_state()
1936 diag, phba->sli4_hba.lnk_info.lnk_tp, in lpfc_sli4_bsg_set_link_diag_state()
1937 phba->sli4_hba.lnk_info.lnk_no); in lpfc_sli4_bsg_set_link_diag_state()
1939 link_diag_state = &pmboxq->u.mqe.un.link_diag_state; in lpfc_sli4_bsg_set_link_diag_state()
1940 bf_set(lpfc_mbx_set_diag_state_diag_bit_valid, &link_diag_state->u.req, in lpfc_sli4_bsg_set_link_diag_state()
1942 bf_set(lpfc_mbx_set_diag_state_link_num, &link_diag_state->u.req, in lpfc_sli4_bsg_set_link_diag_state()
1943 phba->sli4_hba.lnk_info.lnk_no); in lpfc_sli4_bsg_set_link_diag_state()
1944 bf_set(lpfc_mbx_set_diag_state_link_type, &link_diag_state->u.req, in lpfc_sli4_bsg_set_link_diag_state()
1945 phba->sli4_hba.lnk_info.lnk_tp); in lpfc_sli4_bsg_set_link_diag_state()
1948 &link_diag_state->u.req, 1); in lpfc_sli4_bsg_set_link_diag_state()
1951 &link_diag_state->u.req, 0); in lpfc_sli4_bsg_set_link_diag_state()
1955 if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0)) in lpfc_sli4_bsg_set_link_diag_state()
1958 rc = -ENODEV; in lpfc_sli4_bsg_set_link_diag_state()
1962 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_sli4_bsg_set_link_diag_state()
1968 * lpfc_sli4_bsg_set_loopback_mode - set sli4 internal loopback diagnostic
1985 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_bsg_set_loopback_mode()
1987 return -ENOMEM; in lpfc_sli4_bsg_set_loopback_mode()
1988 req_len = (sizeof(struct lpfc_mbx_set_link_diag_loopback) - in lpfc_sli4_bsg_set_loopback_mode()
1994 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_sli4_bsg_set_loopback_mode()
1995 return -ENOMEM; in lpfc_sli4_bsg_set_loopback_mode()
1997 link_diag_loopback = &pmboxq->u.mqe.un.link_diag_loopback; in lpfc_sli4_bsg_set_loopback_mode()
1999 &link_diag_loopback->u.req, link_no); in lpfc_sli4_bsg_set_loopback_mode()
2001 if (phba->sli4_hba.conf_trunk & (1 << link_no)) { in lpfc_sli4_bsg_set_loopback_mode()
2003 &link_diag_loopback->u.req, LPFC_LNK_FC_TRUNKED); in lpfc_sli4_bsg_set_loopback_mode()
2006 &link_diag_loopback->u.req, in lpfc_sli4_bsg_set_loopback_mode()
2007 phba->sli4_hba.lnk_info.lnk_tp); in lpfc_sli4_bsg_set_loopback_mode()
2010 bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->u.req, in lpfc_sli4_bsg_set_loopback_mode()
2014 if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) { in lpfc_sli4_bsg_set_loopback_mode()
2018 pmboxq->u.mb.mbxStatus); in lpfc_sli4_bsg_set_loopback_mode()
2019 rc = -ENODEV; in lpfc_sli4_bsg_set_loopback_mode()
2022 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_sli4_bsg_set_loopback_mode()
2027 * lpfc_sli4_diag_fcport_reg_setup - setup port registrations for diagnostic
2038 if (phba->pport->fc_flag & FC_VFI_REGISTERED) { in lpfc_sli4_diag_fcport_reg_setup()
2042 phba->pport->fc_myDID, phba->fcf.fcfi, in lpfc_sli4_diag_fcport_reg_setup()
2043 phba->sli4_hba.vfi_ids[phba->pport->vfi], in lpfc_sli4_diag_fcport_reg_setup()
2044 phba->vpi_ids[phba->pport->vpi]); in lpfc_sli4_diag_fcport_reg_setup()
2045 return -EINVAL; in lpfc_sli4_diag_fcport_reg_setup()
2047 rc = lpfc_issue_reg_vfi(phba->pport); in lpfc_sli4_diag_fcport_reg_setup()
2052 * lpfc_sli4_bsg_diag_loopback_mode - process an sli4 bsg vendor command
2062 struct fc_bsg_request *bsg_request = job->request; in lpfc_sli4_bsg_diag_loopback_mode()
2063 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_sli4_bsg_diag_loopback_mode()
2069 bsg_reply->reply_payload_rcv_len = 0; in lpfc_sli4_bsg_diag_loopback_mode()
2071 if (job->request_len < sizeof(struct fc_bsg_request) + in lpfc_sli4_bsg_diag_loopback_mode()
2076 job->request_len, in lpfc_sli4_bsg_diag_loopback_mode()
2079 rc = -EINVAL; in lpfc_sli4_bsg_diag_loopback_mode()
2084 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_sli4_bsg_diag_loopback_mode()
2085 link_flags = loopback_mode->type; in lpfc_sli4_bsg_diag_loopback_mode()
2086 timeout = loopback_mode->timeout * 100; in lpfc_sli4_bsg_diag_loopback_mode()
2088 if (loopback_mode->physical_link == -1) in lpfc_sli4_bsg_diag_loopback_mode()
2089 link_no = phba->sli4_hba.lnk_info.lnk_no; in lpfc_sli4_bsg_diag_loopback_mode()
2091 link_no = loopback_mode->physical_link; in lpfc_sli4_bsg_diag_loopback_mode()
2099 phba->sli4_hba.conf_trunk &= ~((1 << link_no) << 4); in lpfc_sli4_bsg_diag_loopback_mode()
2104 if (phba->sli4_hba.conf_trunk & ((1 << link_no) << 4)) { in lpfc_sli4_bsg_diag_loopback_mode()
2105 rc = -EPERM; in lpfc_sli4_bsg_diag_loopback_mode()
2115 spin_lock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_loopback_mode()
2116 phba->link_flag |= LS_LOOPBACK_MODE; in lpfc_sli4_bsg_diag_loopback_mode()
2117 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_loopback_mode()
2138 while (phba->link_state != LPFC_LINK_DOWN) { in lpfc_sli4_bsg_diag_loopback_mode()
2140 rc = -ETIMEDOUT; in lpfc_sli4_bsg_diag_loopback_mode()
2156 if (phba->sli4_hba.conf_trunk & (1 << link_no)) { in lpfc_sli4_bsg_diag_loopback_mode()
2162 if (phba->sli4_hba.conf_trunk) { in lpfc_sli4_bsg_diag_loopback_mode()
2163 rc = -ELNRNG; in lpfc_sli4_bsg_diag_loopback_mode()
2174 phba->sli4_hba.conf_trunk |= (1 << link_no) << 4; in lpfc_sli4_bsg_diag_loopback_mode()
2179 if (phba->sli4_hba.conf_trunk & (1 << link_no)) { in lpfc_sli4_bsg_diag_loopback_mode()
2185 if (phba->sli4_hba.conf_trunk) { in lpfc_sli4_bsg_diag_loopback_mode()
2186 rc = -ELNRNG; in lpfc_sli4_bsg_diag_loopback_mode()
2197 phba->sli4_hba.conf_trunk |= (1 << link_no) << 4; in lpfc_sli4_bsg_diag_loopback_mode()
2202 rc = -EINVAL; in lpfc_sli4_bsg_diag_loopback_mode()
2213 while (phba->link_state < LPFC_LINK_UP) { in lpfc_sli4_bsg_diag_loopback_mode()
2215 rc = -ETIMEDOUT; in lpfc_sli4_bsg_diag_loopback_mode()
2229 phba->pport->fc_myDID = 1; in lpfc_sli4_bsg_diag_loopback_mode()
2238 while (phba->link_state != LPFC_HBA_READY) { in lpfc_sli4_bsg_diag_loopback_mode()
2240 rc = -ETIMEDOUT; in lpfc_sli4_bsg_diag_loopback_mode()
2254 spin_lock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_loopback_mode()
2255 phba->link_flag &= ~LS_LOOPBACK_MODE; in lpfc_sli4_bsg_diag_loopback_mode()
2256 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_loopback_mode()
2262 bsg_reply->result = rc; in lpfc_sli4_bsg_diag_loopback_mode()
2265 bsg_job_done(job, bsg_reply->result, in lpfc_sli4_bsg_diag_loopback_mode()
2266 bsg_reply->reply_payload_rcv_len); in lpfc_sli4_bsg_diag_loopback_mode()
2271 * lpfc_bsg_diag_loopback_mode - bsg vendor command for diag loopback mode
2287 return -ENODEV; in lpfc_bsg_diag_loopback_mode()
2290 return -ENODEV; in lpfc_bsg_diag_loopback_mode()
2291 phba = vport->phba; in lpfc_bsg_diag_loopback_mode()
2293 return -ENODEV; in lpfc_bsg_diag_loopback_mode()
2295 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_bsg_diag_loopback_mode()
2297 else if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_bsg_diag_loopback_mode()
2301 rc = -ENODEV; in lpfc_bsg_diag_loopback_mode()
2307 * lpfc_sli4_bsg_diag_mode_end - sli4 bsg vendor command for ending diag mode
2316 struct fc_bsg_request *bsg_request = job->request; in lpfc_sli4_bsg_diag_mode_end()
2317 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_sli4_bsg_diag_mode_end()
2327 return -ENODEV; in lpfc_sli4_bsg_diag_mode_end()
2330 return -ENODEV; in lpfc_sli4_bsg_diag_mode_end()
2331 phba = vport->phba; in lpfc_sli4_bsg_diag_mode_end()
2333 return -ENODEV; in lpfc_sli4_bsg_diag_mode_end()
2335 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_sli4_bsg_diag_mode_end()
2336 return -ENODEV; in lpfc_sli4_bsg_diag_mode_end()
2337 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_sli4_bsg_diag_mode_end()
2339 return -ENODEV; in lpfc_sli4_bsg_diag_mode_end()
2342 spin_lock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_mode_end()
2343 phba->link_flag &= ~LS_LOOPBACK_MODE; in lpfc_sli4_bsg_diag_mode_end()
2344 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_bsg_diag_mode_end()
2346 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_sli4_bsg_diag_mode_end()
2347 timeout = loopback_mode_end_cmd->timeout * 100; in lpfc_sli4_bsg_diag_mode_end()
2359 while (phba->link_state != LPFC_LINK_DOWN) { in lpfc_sli4_bsg_diag_mode_end()
2373 phba->pport->fc_myDID = 0; in lpfc_sli4_bsg_diag_mode_end()
2377 bsg_reply->result = rc; in lpfc_sli4_bsg_diag_mode_end()
2380 bsg_job_done(job, bsg_reply->result, in lpfc_sli4_bsg_diag_mode_end()
2381 bsg_reply->reply_payload_rcv_len); in lpfc_sli4_bsg_diag_mode_end()
2386 * lpfc_sli4_bsg_link_diag_test - sli4 bsg vendor command for diag link test
2395 struct fc_bsg_request *bsg_request = job->request; in lpfc_sli4_bsg_link_diag_test()
2396 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_sli4_bsg_link_diag_test()
2407 int mbxstatus, rc = -ENODEV, rc1 = 0; in lpfc_sli4_bsg_link_diag_test()
2417 phba = vport->phba; in lpfc_sli4_bsg_link_diag_test()
2422 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_sli4_bsg_link_diag_test()
2425 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_sli4_bsg_link_diag_test()
2429 if (job->request_len < sizeof(struct fc_bsg_request) + in lpfc_sli4_bsg_link_diag_test()
2434 job->request_len, in lpfc_sli4_bsg_link_diag_test()
2437 rc = -EINVAL; in lpfc_sli4_bsg_link_diag_test()
2446 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_sli4_bsg_link_diag_test()
2453 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_bsg_link_diag_test()
2457 req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) - in lpfc_sli4_bsg_link_diag_test()
2463 rc = -ENOMEM; in lpfc_sli4_bsg_link_diag_test()
2467 run_link_diag_test = &pmboxq->u.mqe.un.link_diag_test; in lpfc_sli4_bsg_link_diag_test()
2468 bf_set(lpfc_mbx_run_diag_test_link_num, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2469 phba->sli4_hba.lnk_info.lnk_no); in lpfc_sli4_bsg_link_diag_test()
2470 bf_set(lpfc_mbx_run_diag_test_link_type, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2471 phba->sli4_hba.lnk_info.lnk_tp); in lpfc_sli4_bsg_link_diag_test()
2472 bf_set(lpfc_mbx_run_diag_test_test_id, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2473 link_diag_test_cmd->test_id); in lpfc_sli4_bsg_link_diag_test()
2474 bf_set(lpfc_mbx_run_diag_test_loops, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2475 link_diag_test_cmd->loops); in lpfc_sli4_bsg_link_diag_test()
2476 bf_set(lpfc_mbx_run_diag_test_test_ver, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2477 link_diag_test_cmd->test_version); in lpfc_sli4_bsg_link_diag_test()
2478 bf_set(lpfc_mbx_run_diag_test_err_act, &run_link_diag_test->u.req, in lpfc_sli4_bsg_link_diag_test()
2479 link_diag_test_cmd->error_action); in lpfc_sli4_bsg_link_diag_test()
2484 &pmboxq->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_bsg_link_diag_test()
2485 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_bsg_link_diag_test()
2486 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_bsg_link_diag_test()
2495 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_sli4_bsg_link_diag_test()
2497 if (job->reply_len < sizeof(*bsg_reply) + sizeof(*diag_status_reply)) { in lpfc_sli4_bsg_link_diag_test()
2503 job->reply_len); in lpfc_sli4_bsg_link_diag_test()
2504 rc = -EINVAL; in lpfc_sli4_bsg_link_diag_test()
2508 diag_status_reply->mbox_status = mbxstatus; in lpfc_sli4_bsg_link_diag_test()
2509 diag_status_reply->shdr_status = shdr_status; in lpfc_sli4_bsg_link_diag_test()
2510 diag_status_reply->shdr_add_status = shdr_add_status; in lpfc_sli4_bsg_link_diag_test()
2516 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_sli4_bsg_link_diag_test()
2524 bsg_reply->result = rc; in lpfc_sli4_bsg_link_diag_test()
2527 bsg_job_done(job, bsg_reply->result, in lpfc_sli4_bsg_link_diag_test()
2528 bsg_reply->reply_payload_rcv_len); in lpfc_sli4_bsg_link_diag_test()
2533 * lpfcdiag_loop_self_reg - obtains a remote port login id
2546 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfcdiag_loop_self_reg()
2548 return -ENOMEM; in lpfcdiag_loop_self_reg()
2550 if (phba->sli_rev < LPFC_SLI_REV4) in lpfcdiag_loop_self_reg()
2551 status = lpfc_reg_rpi(phba, 0, phba->pport->fc_myDID, in lpfcdiag_loop_self_reg()
2552 (uint8_t *)&phba->pport->fc_sparam, in lpfcdiag_loop_self_reg()
2557 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_reg()
2558 return -EBUSY; in lpfcdiag_loop_self_reg()
2560 status = lpfc_reg_rpi(phba, phba->pport->vpi, in lpfcdiag_loop_self_reg()
2561 phba->pport->fc_myDID, in lpfcdiag_loop_self_reg()
2562 (uint8_t *)&phba->pport->fc_sparam, in lpfcdiag_loop_self_reg()
2567 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_reg()
2568 if (phba->sli_rev == LPFC_SLI_REV4) in lpfcdiag_loop_self_reg()
2570 return -ENOMEM; in lpfcdiag_loop_self_reg()
2573 dmabuff = (struct lpfc_dmabuf *)mbox->ctx_buf; in lpfcdiag_loop_self_reg()
2574 mbox->ctx_buf = NULL; in lpfcdiag_loop_self_reg()
2575 mbox->ctx_ndlp = NULL; in lpfcdiag_loop_self_reg()
2578 if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) { in lpfcdiag_loop_self_reg()
2579 lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys); in lpfcdiag_loop_self_reg()
2582 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_reg()
2583 if (phba->sli_rev == LPFC_SLI_REV4) in lpfcdiag_loop_self_reg()
2585 return -ENODEV; in lpfcdiag_loop_self_reg()
2588 if (phba->sli_rev < LPFC_SLI_REV4) in lpfcdiag_loop_self_reg()
2589 *rpi = mbox->u.mb.un.varWords[0]; in lpfcdiag_loop_self_reg()
2591 lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys); in lpfcdiag_loop_self_reg()
2593 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_reg()
2598 * lpfcdiag_loop_self_unreg - unregs from the rpi
2610 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfcdiag_loop_self_unreg()
2612 return -ENOMEM; in lpfcdiag_loop_self_unreg()
2614 if (phba->sli_rev < LPFC_SLI_REV4) in lpfcdiag_loop_self_unreg()
2617 lpfc_unreg_login(phba, phba->pport->vpi, in lpfcdiag_loop_self_unreg()
2618 phba->sli4_hba.rpi_ids[rpi], mbox); in lpfcdiag_loop_self_unreg()
2622 if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) { in lpfcdiag_loop_self_unreg()
2624 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_unreg()
2625 return -EIO; in lpfcdiag_loop_self_unreg()
2627 mempool_free(mbox, phba->mbox_mem_pool); in lpfcdiag_loop_self_unreg()
2628 if (phba->sli_rev == LPFC_SLI_REV4) in lpfcdiag_loop_self_unreg()
2634 * lpfcdiag_loop_get_xri - obtains the transmit and receive ids
2661 evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid, in lpfcdiag_loop_get_xri()
2664 return -ENOMEM; in lpfcdiag_loop_get_xri()
2666 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2667 list_add(&evt->node, &phba->ct_ev_waiters); in lpfcdiag_loop_get_xri()
2669 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2676 dmabuf->virt = lpfc_mbuf_alloc(phba, 0, &dmabuf->phys); in lpfcdiag_loop_get_xri()
2677 if (dmabuf->virt) { in lpfcdiag_loop_get_xri()
2678 INIT_LIST_HEAD(&dmabuf->list); in lpfcdiag_loop_get_xri()
2679 bpl = (struct ulp_bde64 *) dmabuf->virt; in lpfcdiag_loop_get_xri()
2682 bpl->addrHigh = in lpfcdiag_loop_get_xri()
2683 le32_to_cpu(putPaddrHigh(dmabuf->phys + in lpfcdiag_loop_get_xri()
2685 bpl->addrLow = in lpfcdiag_loop_get_xri()
2686 le32_to_cpu(putPaddrLow(dmabuf->phys + in lpfcdiag_loop_get_xri()
2688 bpl->tus.f.bdeFlags = 0; in lpfcdiag_loop_get_xri()
2689 bpl->tus.f.bdeSize = ELX_LOOPBACK_HEADER_SZ; in lpfcdiag_loop_get_xri()
2690 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfcdiag_loop_get_xri()
2696 dmabuf->virt == NULL) { in lpfcdiag_loop_get_xri()
2697 ret_val = -ENOMEM; in lpfcdiag_loop_get_xri()
2701 cmd = &cmdiocbq->iocb; in lpfcdiag_loop_get_xri()
2702 rsp = &rspiocbq->iocb; in lpfcdiag_loop_get_xri()
2706 ctreq->RevisionId.bits.Revision = SLI_CT_REVISION; in lpfcdiag_loop_get_xri()
2707 ctreq->RevisionId.bits.InId = 0; in lpfcdiag_loop_get_xri()
2708 ctreq->FsType = SLI_CT_ELX_LOOPBACK; in lpfcdiag_loop_get_xri()
2709 ctreq->FsSubType = 0; in lpfcdiag_loop_get_xri()
2710 ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_XRI_SETUP; in lpfcdiag_loop_get_xri()
2711 ctreq->CommandResponse.bits.Size = 0; in lpfcdiag_loop_get_xri()
2714 cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(dmabuf->phys); in lpfcdiag_loop_get_xri()
2715 cmd->un.xseq64.bdl.addrLow = putPaddrLow(dmabuf->phys); in lpfcdiag_loop_get_xri()
2716 cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; in lpfcdiag_loop_get_xri()
2717 cmd->un.xseq64.bdl.bdeSize = sizeof(*bpl); in lpfcdiag_loop_get_xri()
2719 cmd->un.xseq64.w5.hcsw.Fctl = LA; in lpfcdiag_loop_get_xri()
2720 cmd->un.xseq64.w5.hcsw.Dfctl = 0; in lpfcdiag_loop_get_xri()
2721 cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL; in lpfcdiag_loop_get_xri()
2722 cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT; in lpfcdiag_loop_get_xri()
2724 cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CR; in lpfcdiag_loop_get_xri()
2725 cmd->ulpBdeCount = 1; in lpfcdiag_loop_get_xri()
2726 cmd->ulpLe = 1; in lpfcdiag_loop_get_xri()
2727 cmd->ulpClass = CLASS3; in lpfcdiag_loop_get_xri()
2728 cmd->ulpContext = rpi; in lpfcdiag_loop_get_xri()
2730 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; in lpfcdiag_loop_get_xri()
2731 cmdiocbq->vport = phba->pport; in lpfcdiag_loop_get_xri()
2732 cmdiocbq->iocb_cmpl = NULL; in lpfcdiag_loop_get_xri()
2736 (phba->fc_ratov * 2) in lpfcdiag_loop_get_xri()
2738 if ((iocb_stat != IOCB_SUCCESS) || (rsp->ulpStatus != IOSTAT_SUCCESS)) { in lpfcdiag_loop_get_xri()
2739 ret_val = -EIO; in lpfcdiag_loop_get_xri()
2742 *txxri = rsp->ulpContext; in lpfcdiag_loop_get_xri()
2744 evt->waiting = 1; in lpfcdiag_loop_get_xri()
2745 evt->wait_time_stamp = jiffies; in lpfcdiag_loop_get_xri()
2747 evt->wq, !list_empty(&evt->events_to_see), in lpfcdiag_loop_get_xri()
2749 ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT))); in lpfcdiag_loop_get_xri()
2750 if (list_empty(&evt->events_to_see)) in lpfcdiag_loop_get_xri()
2751 ret_val = (time_left) ? -EINTR : -ETIMEDOUT; in lpfcdiag_loop_get_xri()
2753 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2754 list_move(evt->events_to_see.prev, &evt->events_to_get); in lpfcdiag_loop_get_xri()
2755 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2756 *rxxri = (list_entry(evt->events_to_get.prev, in lpfcdiag_loop_get_xri()
2758 node))->immed_dat; in lpfcdiag_loop_get_xri()
2760 evt->waiting = 0; in lpfcdiag_loop_get_xri()
2763 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2766 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfcdiag_loop_get_xri()
2769 if (dmabuf->virt) in lpfcdiag_loop_get_xri()
2770 lpfc_mbuf_free(phba, dmabuf->virt, dmabuf->phys); in lpfcdiag_loop_get_xri()
2782 * lpfc_bsg_dma_page_alloc - allocate a bsg mbox page sized dma buffers
2792 struct pci_dev *pcidev = phba->pcidev; in lpfc_bsg_dma_page_alloc()
2799 INIT_LIST_HEAD(&dmabuf->list); in lpfc_bsg_dma_page_alloc()
2802 dmabuf->virt = dma_alloc_coherent(&pcidev->dev, BSG_MBOX_SIZE, in lpfc_bsg_dma_page_alloc()
2803 &(dmabuf->phys), GFP_KERNEL); in lpfc_bsg_dma_page_alloc()
2805 if (!dmabuf->virt) { in lpfc_bsg_dma_page_alloc()
2814 * lpfc_bsg_dma_page_free - free a bsg mbox page sized dma buffer
2824 struct pci_dev *pcidev = phba->pcidev; in lpfc_bsg_dma_page_free()
2829 if (dmabuf->virt) in lpfc_bsg_dma_page_free()
2830 dma_free_coherent(&pcidev->dev, BSG_MBOX_SIZE, in lpfc_bsg_dma_page_free()
2831 dmabuf->virt, dmabuf->phys); in lpfc_bsg_dma_page_free()
2837 * lpfc_bsg_dma_page_list_free - free a list of bsg mbox page sized dma buffers
2854 list_del_init(&dmabuf->list); in lpfc_bsg_dma_page_list_free()
2861 * diag_cmd_data_alloc - fills in a bde struct with dma buffers
2881 pcidev = phba->pcidev; in diag_cmd_data_alloc()
2895 INIT_LIST_HEAD(&dmp->dma.list); in diag_cmd_data_alloc()
2899 list_add_tail(&dmp->dma.list, &mlist->dma.list); in diag_cmd_data_alloc()
2904 dmp->dma.virt = dma_alloc_coherent(&pcidev->dev, in diag_cmd_data_alloc()
2906 &(dmp->dma.phys), in diag_cmd_data_alloc()
2909 if (!dmp->dma.virt) in diag_cmd_data_alloc()
2912 dmp->size = cnt; in diag_cmd_data_alloc()
2915 bpl->tus.f.bdeFlags = 0; in diag_cmd_data_alloc()
2917 memset((uint8_t *)dmp->dma.virt, 0, cnt); in diag_cmd_data_alloc()
2918 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I; in diag_cmd_data_alloc()
2922 bpl->addrLow = le32_to_cpu(putPaddrLow(dmp->dma.phys)); in diag_cmd_data_alloc()
2923 bpl->addrHigh = le32_to_cpu(putPaddrHigh(dmp->dma.phys)); in diag_cmd_data_alloc()
2924 bpl->tus.f.bdeSize = (ushort) cnt; in diag_cmd_data_alloc()
2925 bpl->tus.w = le32_to_cpu(bpl->tus.w); in diag_cmd_data_alloc()
2930 size -= cnt; in diag_cmd_data_alloc()
2934 mlist->flag = i; in diag_cmd_data_alloc()
2943 * lpfcdiag_loop_post_rxbufs - post the receive buffers for an unsol CT cmd
2973 rxbmp->virt = lpfc_mbuf_alloc(phba, 0, &rxbmp->phys); in lpfcdiag_loop_post_rxbufs()
2974 if (rxbmp->virt) { in lpfcdiag_loop_post_rxbufs()
2975 INIT_LIST_HEAD(&rxbmp->list); in lpfcdiag_loop_post_rxbufs()
2976 rxbpl = (struct ulp_bde64 *) rxbmp->virt; in lpfcdiag_loop_post_rxbufs()
2982 ret_val = -ENOMEM; in lpfcdiag_loop_post_rxbufs()
2987 num_bde = (uint32_t)rxbuffer->flag; in lpfcdiag_loop_post_rxbufs()
2988 dmp = &rxbuffer->dma; in lpfcdiag_loop_post_rxbufs()
2990 cmd = &cmdiocbq->iocb; in lpfcdiag_loop_post_rxbufs()
2994 list_add_tail(&head, &dmp->list); in lpfcdiag_loop_post_rxbufs()
2999 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfcdiag_loop_post_rxbufs()
3000 mp[i]->buffer_tag = lpfc_sli_get_buffer_tag(phba); in lpfcdiag_loop_post_rxbufs()
3001 cmd->un.quexri64cx.buff.bde.addrHigh = in lpfcdiag_loop_post_rxbufs()
3002 putPaddrHigh(mp[i]->phys); in lpfcdiag_loop_post_rxbufs()
3003 cmd->un.quexri64cx.buff.bde.addrLow = in lpfcdiag_loop_post_rxbufs()
3004 putPaddrLow(mp[i]->phys); in lpfcdiag_loop_post_rxbufs()
3005 cmd->un.quexri64cx.buff.bde.tus.f.bdeSize = in lpfcdiag_loop_post_rxbufs()
3006 ((struct lpfc_dmabufext *)mp[i])->size; in lpfcdiag_loop_post_rxbufs()
3007 cmd->un.quexri64cx.buff.buffer_tag = mp[i]->buffer_tag; in lpfcdiag_loop_post_rxbufs()
3008 cmd->ulpCommand = CMD_QUE_XRI64_CX; in lpfcdiag_loop_post_rxbufs()
3009 cmd->ulpPU = 0; in lpfcdiag_loop_post_rxbufs()
3010 cmd->ulpLe = 1; in lpfcdiag_loop_post_rxbufs()
3011 cmd->ulpBdeCount = 1; in lpfcdiag_loop_post_rxbufs()
3012 cmd->unsli3.que_xri64cx_ext_words.ebde_count = 0; in lpfcdiag_loop_post_rxbufs()
3015 cmd->un.cont64[i].addrHigh = putPaddrHigh(mp[i]->phys); in lpfcdiag_loop_post_rxbufs()
3016 cmd->un.cont64[i].addrLow = putPaddrLow(mp[i]->phys); in lpfcdiag_loop_post_rxbufs()
3017 cmd->un.cont64[i].tus.f.bdeSize = in lpfcdiag_loop_post_rxbufs()
3018 ((struct lpfc_dmabufext *)mp[i])->size; in lpfcdiag_loop_post_rxbufs()
3019 cmd->ulpBdeCount = ++i; in lpfcdiag_loop_post_rxbufs()
3021 if ((--num_bde > 0) && (i < 2)) in lpfcdiag_loop_post_rxbufs()
3024 cmd->ulpCommand = CMD_QUE_XRI_BUF64_CX; in lpfcdiag_loop_post_rxbufs()
3025 cmd->ulpLe = 1; in lpfcdiag_loop_post_rxbufs()
3028 cmd->ulpClass = CLASS3; in lpfcdiag_loop_post_rxbufs()
3029 cmd->ulpContext = rxxri; in lpfcdiag_loop_post_rxbufs()
3040 ret_val = -EIO; in lpfcdiag_loop_post_rxbufs()
3054 ret_val = -EIO; in lpfcdiag_loop_post_rxbufs()
3058 cmd = &cmdiocbq->iocb; in lpfcdiag_loop_post_rxbufs()
3066 if (rxbmp->virt) in lpfcdiag_loop_post_rxbufs()
3067 lpfc_mbuf_free(phba, rxbmp->virt, rxbmp->phys); in lpfcdiag_loop_post_rxbufs()
3077 * lpfc_bsg_diag_loopback_run - run loopback on a port by issue ct cmd to itself
3099 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_diag_loopback_run()
3100 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_diag_loopback_run()
3103 struct lpfc_sli *psli = &phba->sli; in lpfc_bsg_diag_loopback_run()
3127 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_diag_loopback_run()
3129 if (job->request_len < in lpfc_bsg_diag_loopback_run()
3134 rc = -EINVAL; in lpfc_bsg_diag_loopback_run()
3138 if (job->request_payload.payload_len != in lpfc_bsg_diag_loopback_run()
3139 job->reply_payload.payload_len) { in lpfc_bsg_diag_loopback_run()
3140 rc = -EINVAL; in lpfc_bsg_diag_loopback_run()
3144 if ((phba->link_state == LPFC_HBA_ERROR) || in lpfc_bsg_diag_loopback_run()
3145 (psli->sli_flag & LPFC_BLOCK_MGMT_IO) || in lpfc_bsg_diag_loopback_run()
3146 (!(psli->sli_flag & LPFC_SLI_ACTIVE))) { in lpfc_bsg_diag_loopback_run()
3147 rc = -EACCES; in lpfc_bsg_diag_loopback_run()
3151 if (!lpfc_is_link_up(phba) || !(phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_bsg_diag_loopback_run()
3152 rc = -EACCES; in lpfc_bsg_diag_loopback_run()
3156 size = job->request_payload.payload_len; in lpfc_bsg_diag_loopback_run()
3160 rc = -ERANGE; in lpfc_bsg_diag_loopback_run()
3167 * then we allocate 64k and re-use that buffer over and over to in lpfc_bsg_diag_loopback_run()
3182 rc = -ENOMEM; in lpfc_bsg_diag_loopback_run()
3188 sg_copy_to_buffer(job->request_payload.sg_list, in lpfc_bsg_diag_loopback_run()
3189 job->request_payload.sg_cnt, in lpfc_bsg_diag_loopback_run()
3195 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_bsg_diag_loopback_run()
3208 evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid, in lpfc_bsg_diag_loopback_run()
3212 rc = -ENOMEM; in lpfc_bsg_diag_loopback_run()
3216 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3217 list_add(&evt->node, &phba->ct_ev_waiters); in lpfc_bsg_diag_loopback_run()
3219 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3222 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_bsg_diag_loopback_run()
3227 txbmp->virt = lpfc_mbuf_alloc(phba, 0, &txbmp->phys); in lpfc_bsg_diag_loopback_run()
3228 if (txbmp->virt) { in lpfc_bsg_diag_loopback_run()
3229 INIT_LIST_HEAD(&txbmp->list); in lpfc_bsg_diag_loopback_run()
3230 txbpl = (struct ulp_bde64 *) txbmp->virt; in lpfc_bsg_diag_loopback_run()
3236 if (!cmdiocbq || !txbmp || !txbpl || !txbuffer || !txbmp->virt) { in lpfc_bsg_diag_loopback_run()
3237 rc = -ENOMEM; in lpfc_bsg_diag_loopback_run()
3240 if ((phba->sli_rev < LPFC_SLI_REV4) && !rspiocbq) { in lpfc_bsg_diag_loopback_run()
3241 rc = -ENOMEM; in lpfc_bsg_diag_loopback_run()
3245 cmd = &cmdiocbq->iocb; in lpfc_bsg_diag_loopback_run()
3246 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_bsg_diag_loopback_run()
3247 rsp = &rspiocbq->iocb; in lpfc_bsg_diag_loopback_run()
3250 list_add_tail(&head, &txbuffer->dma.list); in lpfc_bsg_diag_loopback_run()
3252 segment_len = ((struct lpfc_dmabufext *)curr)->size; in lpfc_bsg_diag_loopback_run()
3254 ctreq = curr->virt; in lpfc_bsg_diag_loopback_run()
3256 ctreq->RevisionId.bits.Revision = SLI_CT_REVISION; in lpfc_bsg_diag_loopback_run()
3257 ctreq->RevisionId.bits.InId = 0; in lpfc_bsg_diag_loopback_run()
3258 ctreq->FsType = SLI_CT_ELX_LOOPBACK; in lpfc_bsg_diag_loopback_run()
3259 ctreq->FsSubType = 0; in lpfc_bsg_diag_loopback_run()
3260 ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_DATA; in lpfc_bsg_diag_loopback_run()
3261 ctreq->CommandResponse.bits.Size = size; in lpfc_bsg_diag_loopback_run()
3267 memcpy(curr->virt + segment_offset, in lpfc_bsg_diag_loopback_run()
3269 segment_len - segment_offset); in lpfc_bsg_diag_loopback_run()
3271 current_offset += segment_len - segment_offset; in lpfc_bsg_diag_loopback_run()
3277 num_bde = (uint32_t)txbuffer->flag; in lpfc_bsg_diag_loopback_run()
3279 cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(txbmp->phys); in lpfc_bsg_diag_loopback_run()
3280 cmd->un.xseq64.bdl.addrLow = putPaddrLow(txbmp->phys); in lpfc_bsg_diag_loopback_run()
3281 cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; in lpfc_bsg_diag_loopback_run()
3282 cmd->un.xseq64.bdl.bdeSize = (num_bde * sizeof(struct ulp_bde64)); in lpfc_bsg_diag_loopback_run()
3284 cmd->un.xseq64.w5.hcsw.Fctl = (LS | LA); in lpfc_bsg_diag_loopback_run()
3285 cmd->un.xseq64.w5.hcsw.Dfctl = 0; in lpfc_bsg_diag_loopback_run()
3286 cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL; in lpfc_bsg_diag_loopback_run()
3287 cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT; in lpfc_bsg_diag_loopback_run()
3289 cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX; in lpfc_bsg_diag_loopback_run()
3290 cmd->ulpBdeCount = 1; in lpfc_bsg_diag_loopback_run()
3291 cmd->ulpLe = 1; in lpfc_bsg_diag_loopback_run()
3292 cmd->ulpClass = CLASS3; in lpfc_bsg_diag_loopback_run()
3294 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_bsg_diag_loopback_run()
3295 cmd->ulpContext = txxri; in lpfc_bsg_diag_loopback_run()
3297 cmd->un.xseq64.bdl.ulpIoTag32 = 0; in lpfc_bsg_diag_loopback_run()
3298 cmd->un.ulpWord[3] = phba->sli4_hba.rpi_ids[rpi]; in lpfc_bsg_diag_loopback_run()
3299 cmdiocbq->context3 = txbmp; in lpfc_bsg_diag_loopback_run()
3300 cmdiocbq->sli4_xritag = NO_XRI; in lpfc_bsg_diag_loopback_run()
3301 cmd->unsli3.rcvsli3.ox_id = 0xffff; in lpfc_bsg_diag_loopback_run()
3303 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; in lpfc_bsg_diag_loopback_run()
3304 cmdiocbq->iocb_flag |= LPFC_IO_LOOPBACK; in lpfc_bsg_diag_loopback_run()
3305 cmdiocbq->vport = phba->pport; in lpfc_bsg_diag_loopback_run()
3306 cmdiocbq->iocb_cmpl = NULL; in lpfc_bsg_diag_loopback_run()
3308 rspiocbq, (phba->fc_ratov * 2) + in lpfc_bsg_diag_loopback_run()
3312 ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_bsg_diag_loopback_run()
3313 (rsp->ulpStatus != IOSTAT_SUCCESS))) { in lpfc_bsg_diag_loopback_run()
3317 rc = -EIO; in lpfc_bsg_diag_loopback_run()
3321 evt->waiting = 1; in lpfc_bsg_diag_loopback_run()
3323 evt->wq, !list_empty(&evt->events_to_see), in lpfc_bsg_diag_loopback_run()
3325 ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT))); in lpfc_bsg_diag_loopback_run()
3326 evt->waiting = 0; in lpfc_bsg_diag_loopback_run()
3327 if (list_empty(&evt->events_to_see)) { in lpfc_bsg_diag_loopback_run()
3328 rc = (time_left) ? -EINTR : -ETIMEDOUT; in lpfc_bsg_diag_loopback_run()
3333 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3334 list_move(evt->events_to_see.prev, &evt->events_to_get); in lpfc_bsg_diag_loopback_run()
3335 evdat = list_entry(evt->events_to_get.prev, in lpfc_bsg_diag_loopback_run()
3337 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3338 rx_databuf = evdat->data; in lpfc_bsg_diag_loopback_run()
3339 if (evdat->len != full_size) { in lpfc_bsg_diag_loopback_run()
3344 evdat->len, full_size); in lpfc_bsg_diag_loopback_run()
3345 rc = -EIO; in lpfc_bsg_diag_loopback_run()
3347 rc = -EIO; in lpfc_bsg_diag_loopback_run()
3352 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_diag_loopback_run()
3353 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_diag_loopback_run()
3354 job->reply_payload.sg_cnt, in lpfc_bsg_diag_loopback_run()
3356 bsg_reply->reply_payload_rcv_len = size; in lpfc_bsg_diag_loopback_run()
3363 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3366 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_diag_loopback_run()
3378 lpfc_mbuf_free(phba, txbmp->virt, txbmp->phys); in lpfc_bsg_diag_loopback_run()
3386 bsg_reply->result = rc; in lpfc_bsg_diag_loopback_run()
3387 job->dd_data = NULL; in lpfc_bsg_diag_loopback_run()
3390 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_diag_loopback_run()
3391 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_diag_loopback_run()
3396 * lpfc_bsg_get_dfc_rev - process a GET_DFC_REV bsg vendor command
3403 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_get_dfc_rev()
3404 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_get_dfc_rev()
3408 if (job->request_len < in lpfc_bsg_get_dfc_rev()
3413 rc = -EINVAL; in lpfc_bsg_get_dfc_rev()
3418 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_bsg_get_dfc_rev()
3420 if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) { in lpfc_bsg_get_dfc_rev()
3424 rc = -EINVAL; in lpfc_bsg_get_dfc_rev()
3428 event_reply->info.a_Major = MANAGEMENT_MAJOR_REV; in lpfc_bsg_get_dfc_rev()
3429 event_reply->info.a_Minor = MANAGEMENT_MINOR_REV; in lpfc_bsg_get_dfc_rev()
3431 bsg_reply->result = rc; in lpfc_bsg_get_dfc_rev()
3433 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_get_dfc_rev()
3434 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_get_dfc_rev()
3439 * lpfc_bsg_issue_mbox_cmpl - lpfc_bsg_issue_mbox mbox completion handler
3459 dd_data = pmboxq->ctx_ndlp; in lpfc_bsg_issue_mbox_cmpl()
3465 pmb = (uint8_t *)&pmboxq->u.mb; in lpfc_bsg_issue_mbox_cmpl()
3466 pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb; in lpfc_bsg_issue_mbox_cmpl()
3471 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_issue_mbox_cmpl()
3472 job = dd_data->set_job; in lpfc_bsg_issue_mbox_cmpl()
3475 job->dd_data = NULL; in lpfc_bsg_issue_mbox_cmpl()
3477 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_issue_mbox_cmpl()
3482 bsg_reply = job->reply; in lpfc_bsg_issue_mbox_cmpl()
3483 size = job->reply_payload.payload_len; in lpfc_bsg_issue_mbox_cmpl()
3484 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_issue_mbox_cmpl()
3485 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_issue_mbox_cmpl()
3486 job->reply_payload.sg_cnt, in lpfc_bsg_issue_mbox_cmpl()
3490 dd_data->set_job = NULL; in lpfc_bsg_issue_mbox_cmpl()
3491 mempool_free(dd_data->context_un.mbox.pmboxq, phba->mbox_mem_pool); in lpfc_bsg_issue_mbox_cmpl()
3492 lpfc_bsg_dma_page_free(phba, dd_data->context_un.mbox.dmabuffers); in lpfc_bsg_issue_mbox_cmpl()
3498 bsg_reply->result = 0; in lpfc_bsg_issue_mbox_cmpl()
3499 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_issue_mbox_cmpl()
3500 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_issue_mbox_cmpl()
3506 * lpfc_bsg_check_cmd_access - test for a supported mailbox command
3518 switch (mb->mbxCommand) { in lpfc_bsg_check_cmd_access()
3531 if (!(vport->fc_flag & FC_OFFLINE_MODE)) { in lpfc_bsg_check_cmd_access()
3533 "2743 Command 0x%x is illegal in on-line " in lpfc_bsg_check_cmd_access()
3535 mb->mbxCommand); in lpfc_bsg_check_cmd_access()
3536 return -EPERM; in lpfc_bsg_check_cmd_access()
3570 mb->un.varWords[0], in lpfc_bsg_check_cmd_access()
3571 mb->un.varWords[1]); in lpfc_bsg_check_cmd_access()
3572 if ((mb->un.varWords[0] == SETVAR_MLOMNT) in lpfc_bsg_check_cmd_access()
3573 && (mb->un.varWords[1] == 1)) { in lpfc_bsg_check_cmd_access()
3574 phba->wait_4_mlo_maint_flg = 1; in lpfc_bsg_check_cmd_access()
3575 } else if (mb->un.varWords[0] == SETVAR_MLORST) { in lpfc_bsg_check_cmd_access()
3576 spin_lock_irq(&phba->hbalock); in lpfc_bsg_check_cmd_access()
3577 phba->link_flag &= ~LS_LOOPBACK_MODE; in lpfc_bsg_check_cmd_access()
3578 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_check_cmd_access()
3579 phba->fc_topology = LPFC_TOPOLOGY_PT_PT; in lpfc_bsg_check_cmd_access()
3590 mb->mbxCommand); in lpfc_bsg_check_cmd_access()
3591 return -EPERM; in lpfc_bsg_check_cmd_access()
3598 * lpfc_bsg_mbox_ext_cleanup - clean up context of multi-buffer mbox session
3601 * This is routine clean up and reset BSG handling of multi-buffer mbox
3607 if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE) in lpfc_bsg_mbox_ext_session_reset()
3612 &phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_bsg_mbox_ext_session_reset()
3613 lpfc_bsg_dma_page_free(phba, phba->mbox_ext_buf_ctx.mbx_dmabuf); in lpfc_bsg_mbox_ext_session_reset()
3614 /* multi-buffer write mailbox command pass-through complete */ in lpfc_bsg_mbox_ext_session_reset()
3615 memset((char *)&phba->mbox_ext_buf_ctx, 0, in lpfc_bsg_mbox_ext_session_reset()
3617 INIT_LIST_HEAD(&phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_bsg_mbox_ext_session_reset()
3623 * lpfc_bsg_issue_mbox_ext_handle_job - job handler for multi-buffer mbox cmpl
3644 dd_data = pmboxq->ctx_buf; in lpfc_bsg_issue_mbox_ext_handle_job()
3647 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_issue_mbox_ext_handle_job()
3648 job = dd_data->set_job; in lpfc_bsg_issue_mbox_ext_handle_job()
3650 bsg_reply = job->reply; in lpfc_bsg_issue_mbox_ext_handle_job()
3652 job->dd_data = NULL; in lpfc_bsg_issue_mbox_ext_handle_job()
3654 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_issue_mbox_ext_handle_job()
3661 pmb = (uint8_t *)&pmboxq->u.mb; in lpfc_bsg_issue_mbox_ext_handle_job()
3662 pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb; in lpfc_bsg_issue_mbox_ext_handle_job()
3665 /* if there is any non-embedded extended data copy that too */ in lpfc_bsg_issue_mbox_ext_handle_job()
3666 dmabuf = phba->mbox_ext_buf_ctx.mbx_dmabuf; in lpfc_bsg_issue_mbox_ext_handle_job()
3667 sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt; in lpfc_bsg_issue_mbox_ext_handle_job()
3669 &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) { in lpfc_bsg_issue_mbox_ext_handle_job()
3670 pmbx = (uint8_t *)dmabuf->virt; in lpfc_bsg_issue_mbox_ext_handle_job()
3674 sli_cfg_mbx->un.sli_config_emb0_subsys.mse[0].buf_len); in lpfc_bsg_issue_mbox_ext_handle_job()
3680 size = job->reply_payload.payload_len; in lpfc_bsg_issue_mbox_ext_handle_job()
3681 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_issue_mbox_ext_handle_job()
3682 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_issue_mbox_ext_handle_job()
3683 job->reply_payload.sg_cnt, in lpfc_bsg_issue_mbox_ext_handle_job()
3687 bsg_reply->result = 0; in lpfc_bsg_issue_mbox_ext_handle_job()
3690 "2937 SLI_CONFIG ext-buffer mailbox command " in lpfc_bsg_issue_mbox_ext_handle_job()
3692 phba->mbox_ext_buf_ctx.nembType, in lpfc_bsg_issue_mbox_ext_handle_job()
3693 phba->mbox_ext_buf_ctx.mboxType, size); in lpfc_bsg_issue_mbox_ext_handle_job()
3695 phba->mbox_ext_buf_ctx.nembType, in lpfc_bsg_issue_mbox_ext_handle_job()
3696 phba->mbox_ext_buf_ctx.mboxType, in lpfc_bsg_issue_mbox_ext_handle_job()
3698 phba->mbox_ext_buf_ctx.mbx_dmabuf, 0); in lpfc_bsg_issue_mbox_ext_handle_job()
3701 "2938 SLI_CONFIG ext-buffer mailbox " in lpfc_bsg_issue_mbox_ext_handle_job()
3703 phba->mbox_ext_buf_ctx.nembType, in lpfc_bsg_issue_mbox_ext_handle_job()
3704 phba->mbox_ext_buf_ctx.mboxType, rc); in lpfc_bsg_issue_mbox_ext_handle_job()
3709 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_DONE; in lpfc_bsg_issue_mbox_ext_handle_job()
3715 * lpfc_bsg_issue_read_mbox_ext_cmpl - compl handler for multi-buffer read mbox
3732 pmboxq->u.mb.mbxStatus = MBXERR_ERROR; in lpfc_bsg_issue_read_mbox_ext_cmpl()
3735 "2939 SLI_CONFIG ext-buffer rd mailbox command " in lpfc_bsg_issue_read_mbox_ext_cmpl()
3737 phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus); in lpfc_bsg_issue_read_mbox_ext_cmpl()
3739 if (pmboxq->u.mb.mbxStatus || phba->mbox_ext_buf_ctx.numBuf == 1) in lpfc_bsg_issue_read_mbox_ext_cmpl()
3743 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_issue_read_mbox_ext_cmpl()
3747 bsg_reply = job->reply; in lpfc_bsg_issue_read_mbox_ext_cmpl()
3748 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_issue_read_mbox_ext_cmpl()
3749 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_issue_read_mbox_ext_cmpl()
3755 * lpfc_bsg_issue_write_mbox_ext_cmpl - cmpl handler for multi-buffer write mbox
3772 pmboxq->u.mb.mbxStatus = MBXERR_ERROR; in lpfc_bsg_issue_write_mbox_ext_cmpl()
3775 "2940 SLI_CONFIG ext-buffer wr mailbox command " in lpfc_bsg_issue_write_mbox_ext_cmpl()
3777 phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus); in lpfc_bsg_issue_write_mbox_ext_cmpl()
3780 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_issue_write_mbox_ext_cmpl()
3785 bsg_reply = job->reply; in lpfc_bsg_issue_write_mbox_ext_cmpl()
3786 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_issue_write_mbox_ext_cmpl()
3787 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_issue_write_mbox_ext_cmpl()
3801 sli_cfg_mbx = (struct lpfc_sli_config_mbox *)mbx_dmabuf->virt; in lpfc_bsg_sli_cfg_dma_desc_setup()
3805 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3807 putPaddrHigh(mbx_dmabuf->phys + in lpfc_bsg_sli_cfg_dma_desc_setup()
3809 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3811 putPaddrLow(mbx_dmabuf->phys + in lpfc_bsg_sli_cfg_dma_desc_setup()
3817 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3819 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3821 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3824 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3826 putPaddrHigh(ext_dmabuf->phys); in lpfc_bsg_sli_cfg_dma_desc_setup()
3827 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3829 putPaddrLow(ext_dmabuf->phys); in lpfc_bsg_sli_cfg_dma_desc_setup()
3834 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3836 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3838 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3843 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3845 putPaddrHigh(mbx_dmabuf->phys + in lpfc_bsg_sli_cfg_dma_desc_setup()
3847 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3849 putPaddrLow(mbx_dmabuf->phys + in lpfc_bsg_sli_cfg_dma_desc_setup()
3856 &sli_cfg_mbx->un. in lpfc_bsg_sli_cfg_dma_desc_setup()
3858 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3860 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3864 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3866 putPaddrHigh(ext_dmabuf->phys); in lpfc_bsg_sli_cfg_dma_desc_setup()
3867 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3869 putPaddrLow(ext_dmabuf->phys); in lpfc_bsg_sli_cfg_dma_desc_setup()
3875 &sli_cfg_mbx->un. in lpfc_bsg_sli_cfg_dma_desc_setup()
3877 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3879 sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_dma_desc_setup()
3887 * lpfc_bsg_sli_cfg_mse_read_cmd_ext - sli_config non-embedded mailbox cmd read
3890 * @nemb_tp: Enumerate of non-embedded mailbox command type.
3894 * non-embedded external bufffers.
3901 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_sli_cfg_read_cmd_ext()
3914 (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_sli_cfg_read_cmd_ext()
3917 sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt; in lpfc_bsg_sli_cfg_read_cmd_ext()
3921 &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr); in lpfc_bsg_sli_cfg_read_cmd_ext()
3928 rc = -ERANGE; in lpfc_bsg_sli_cfg_read_cmd_ext()
3936 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_bsg_sli_cfg_read_cmd_ext()
3938 rc = -ENODEV; in lpfc_bsg_sli_cfg_read_cmd_ext()
3942 ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count; in lpfc_bsg_sli_cfg_read_cmd_ext()
3949 rc = -ERANGE; in lpfc_bsg_sli_cfg_read_cmd_ext()
3961 /* reject non-embedded mailbox command with none external buffer */ in lpfc_bsg_sli_cfg_read_cmd_ext()
3963 rc = -EPERM; in lpfc_bsg_sli_cfg_read_cmd_ext()
3970 rc = -ENOMEM; in lpfc_bsg_sli_cfg_read_cmd_ext()
3973 list_add_tail(&ext_dmabuf->list, in lpfc_bsg_sli_cfg_read_cmd_ext()
3974 &phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_bsg_sli_cfg_read_cmd_ext()
3981 rc = -ENOMEM; in lpfc_bsg_sli_cfg_read_cmd_ext()
3986 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_bsg_sli_cfg_read_cmd_ext()
3988 rc = -ENOMEM; in lpfc_bsg_sli_cfg_read_cmd_ext()
4000 &phba->mbox_ext_buf_ctx.ext_dmabuf_list, list) { in lpfc_bsg_sli_cfg_read_cmd_ext()
4013 pmb = &pmboxq->u.mb; in lpfc_bsg_sli_cfg_read_cmd_ext()
4014 pmbx = (uint8_t *)dmabuf->virt; in lpfc_bsg_sli_cfg_read_cmd_ext()
4016 pmb->mbxOwner = OWN_HOST; in lpfc_bsg_sli_cfg_read_cmd_ext()
4017 pmboxq->vport = phba->pport; in lpfc_bsg_sli_cfg_read_cmd_ext()
4019 /* multi-buffer handling context */ in lpfc_bsg_sli_cfg_read_cmd_ext()
4020 phba->mbox_ext_buf_ctx.nembType = nemb_tp; in lpfc_bsg_sli_cfg_read_cmd_ext()
4021 phba->mbox_ext_buf_ctx.mboxType = mbox_rd; in lpfc_bsg_sli_cfg_read_cmd_ext()
4022 phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt; in lpfc_bsg_sli_cfg_read_cmd_ext()
4023 phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag; in lpfc_bsg_sli_cfg_read_cmd_ext()
4024 phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum; in lpfc_bsg_sli_cfg_read_cmd_ext()
4025 phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf; in lpfc_bsg_sli_cfg_read_cmd_ext()
4027 /* callback for multi-buffer read mailbox command */ in lpfc_bsg_sli_cfg_read_cmd_ext()
4028 pmboxq->mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl; in lpfc_bsg_sli_cfg_read_cmd_ext()
4031 pmboxq->ctx_buf = dd_data; in lpfc_bsg_sli_cfg_read_cmd_ext()
4032 dd_data->type = TYPE_MBOX; in lpfc_bsg_sli_cfg_read_cmd_ext()
4033 dd_data->set_job = job; in lpfc_bsg_sli_cfg_read_cmd_ext()
4034 dd_data->context_un.mbox.pmboxq = pmboxq; in lpfc_bsg_sli_cfg_read_cmd_ext()
4035 dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx; in lpfc_bsg_sli_cfg_read_cmd_ext()
4036 job->dd_data = dd_data; in lpfc_bsg_sli_cfg_read_cmd_ext()
4039 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT; in lpfc_bsg_sli_cfg_read_cmd_ext()
4042 * Non-embedded mailbox subcommand data gets byte swapped here because in lpfc_bsg_sli_cfg_read_cmd_ext()
4046 &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) && in lpfc_bsg_sli_cfg_read_cmd_ext()
4050 sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_read_cmd_ext()
4056 "2947 Issued SLI_CONFIG ext-buffer " in lpfc_bsg_sli_cfg_read_cmd_ext()
4061 "2948 Failed to issue SLI_CONFIG ext-buffer " in lpfc_bsg_sli_cfg_read_cmd_ext()
4063 rc = -EPIPE; in lpfc_bsg_sli_cfg_read_cmd_ext()
4067 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_sli_cfg_read_cmd_ext()
4069 &phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_bsg_sli_cfg_read_cmd_ext()
4071 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE; in lpfc_bsg_sli_cfg_read_cmd_ext()
4076 * lpfc_bsg_sli_cfg_write_cmd_ext - sli_config non-embedded mailbox cmd write
4082 * non-embedded external bufffers.
4089 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_sli_cfg_write_cmd_ext()
4090 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_sli_cfg_write_cmd_ext()
4101 (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_sli_cfg_write_cmd_ext()
4104 sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt; in lpfc_bsg_sli_cfg_write_cmd_ext()
4108 &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr); in lpfc_bsg_sli_cfg_write_cmd_ext()
4115 return -ERANGE; in lpfc_bsg_sli_cfg_write_cmd_ext()
4122 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_bsg_sli_cfg_write_cmd_ext()
4124 return -ENODEV; in lpfc_bsg_sli_cfg_write_cmd_ext()
4126 ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count; in lpfc_bsg_sli_cfg_write_cmd_ext()
4133 return -ERANGE; in lpfc_bsg_sli_cfg_write_cmd_ext()
4145 return -EPERM; in lpfc_bsg_sli_cfg_write_cmd_ext()
4158 "2951 SLI_CONFIG(mse), buf[%d]-length:%d\n", in lpfc_bsg_sli_cfg_write_cmd_ext()
4159 i, sli_cfg_mbx->un.sli_config_emb0_subsys. in lpfc_bsg_sli_cfg_write_cmd_ext()
4163 "2952 SLI_CONFIG(hbd), buf[%d]-length:%d\n", in lpfc_bsg_sli_cfg_write_cmd_ext()
4165 &sli_cfg_mbx->un.sli_config_emb1_subsys. in lpfc_bsg_sli_cfg_write_cmd_ext()
4169 /* multi-buffer handling context */ in lpfc_bsg_sli_cfg_write_cmd_ext()
4170 phba->mbox_ext_buf_ctx.nembType = nemb_tp; in lpfc_bsg_sli_cfg_write_cmd_ext()
4171 phba->mbox_ext_buf_ctx.mboxType = mbox_wr; in lpfc_bsg_sli_cfg_write_cmd_ext()
4172 phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt; in lpfc_bsg_sli_cfg_write_cmd_ext()
4173 phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag; in lpfc_bsg_sli_cfg_write_cmd_ext()
4174 phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum; in lpfc_bsg_sli_cfg_write_cmd_ext()
4175 phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf; in lpfc_bsg_sli_cfg_write_cmd_ext()
4181 rc = -ENOMEM; in lpfc_bsg_sli_cfg_write_cmd_ext()
4186 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_bsg_sli_cfg_write_cmd_ext()
4188 rc = -ENOMEM; in lpfc_bsg_sli_cfg_write_cmd_ext()
4192 pmb = &pmboxq->u.mb; in lpfc_bsg_sli_cfg_write_cmd_ext()
4193 mbx = (uint8_t *)dmabuf->virt; in lpfc_bsg_sli_cfg_write_cmd_ext()
4195 pmb->mbxOwner = OWN_HOST; in lpfc_bsg_sli_cfg_write_cmd_ext()
4196 pmboxq->vport = phba->pport; in lpfc_bsg_sli_cfg_write_cmd_ext()
4198 /* callback for multi-buffer read mailbox command */ in lpfc_bsg_sli_cfg_write_cmd_ext()
4199 pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl; in lpfc_bsg_sli_cfg_write_cmd_ext()
4202 pmboxq->ctx_buf = dd_data; in lpfc_bsg_sli_cfg_write_cmd_ext()
4203 dd_data->type = TYPE_MBOX; in lpfc_bsg_sli_cfg_write_cmd_ext()
4204 dd_data->set_job = job; in lpfc_bsg_sli_cfg_write_cmd_ext()
4205 dd_data->context_un.mbox.pmboxq = pmboxq; in lpfc_bsg_sli_cfg_write_cmd_ext()
4206 dd_data->context_un.mbox.mb = (MAILBOX_t *)mbx; in lpfc_bsg_sli_cfg_write_cmd_ext()
4207 job->dd_data = dd_data; in lpfc_bsg_sli_cfg_write_cmd_ext()
4211 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT; in lpfc_bsg_sli_cfg_write_cmd_ext()
4215 "2955 Issued SLI_CONFIG ext-buffer " in lpfc_bsg_sli_cfg_write_cmd_ext()
4220 "2956 Failed to issue SLI_CONFIG ext-buffer " in lpfc_bsg_sli_cfg_write_cmd_ext()
4222 rc = -EPIPE; in lpfc_bsg_sli_cfg_write_cmd_ext()
4228 bsg_reply->result = 0; in lpfc_bsg_sli_cfg_write_cmd_ext()
4229 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_sli_cfg_write_cmd_ext()
4230 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_sli_cfg_write_cmd_ext()
4235 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_sli_cfg_write_cmd_ext()
4242 * lpfc_bsg_handle_sli_cfg_mbox - handle sli-cfg mailbox cmd with ext buffer
4247 * This routine handles SLI_CONFIG (0x9B) mailbox command with non-embedded
4248 * external bufffers, including both 0x9B with non-embedded MSEs and 0x9B
4260 /* state change on new multi-buffer pass-through mailbox command */ in lpfc_bsg_handle_sli_cfg_mbox()
4261 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_HOST; in lpfc_bsg_handle_sli_cfg_mbox()
4263 sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt; in lpfc_bsg_handle_sli_cfg_mbox()
4266 &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) { in lpfc_bsg_handle_sli_cfg_mbox()
4268 &sli_cfg_mbx->un.sli_config_emb0_subsys); in lpfc_bsg_handle_sli_cfg_mbox()
4270 &sli_cfg_mbx->un.sli_config_emb0_subsys); in lpfc_bsg_handle_sli_cfg_mbox()
4297 rc = -EPERM; in lpfc_bsg_handle_sli_cfg_mbox()
4318 rc = -EPERM; in lpfc_bsg_handle_sli_cfg_mbox()
4326 rc = -EPERM; in lpfc_bsg_handle_sli_cfg_mbox()
4330 &sli_cfg_mbx->un.sli_config_emb1_subsys); in lpfc_bsg_handle_sli_cfg_mbox()
4332 &sli_cfg_mbx->un.sli_config_emb1_subsys); in lpfc_bsg_handle_sli_cfg_mbox()
4369 /* state reset on not handled new multi-buffer mailbox command */ in lpfc_bsg_handle_sli_cfg_mbox()
4371 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE; in lpfc_bsg_handle_sli_cfg_mbox()
4377 * lpfc_bsg_mbox_ext_abort_req - request to abort mbox command with ext buffers
4380 * This routine is for requesting to abort a pass-through mailbox command with
4386 if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT) in lpfc_bsg_mbox_ext_abort()
4387 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS; in lpfc_bsg_mbox_ext_abort()
4394 * lpfc_bsg_read_ebuf_get - get the next mailbox read external buffer
4404 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_read_ebuf_get()
4411 index = phba->mbox_ext_buf_ctx.seqNum; in lpfc_bsg_read_ebuf_get()
4412 phba->mbox_ext_buf_ctx.seqNum++; in lpfc_bsg_read_ebuf_get()
4415 phba->mbox_ext_buf_ctx.mbx_dmabuf->virt; in lpfc_bsg_read_ebuf_get()
4417 if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) { in lpfc_bsg_read_ebuf_get()
4419 &sli_cfg_mbx->un.sli_config_emb0_subsys.mse[index]); in lpfc_bsg_read_ebuf_get()
4421 "2963 SLI_CONFIG (mse) ext-buffer rd get " in lpfc_bsg_read_ebuf_get()
4425 &sli_cfg_mbx->un.sli_config_emb1_subsys.hbd[index]); in lpfc_bsg_read_ebuf_get()
4427 "2964 SLI_CONFIG (hbd) ext-buffer rd get " in lpfc_bsg_read_ebuf_get()
4430 if (list_empty(&phba->mbox_ext_buf_ctx.ext_dmabuf_list)) in lpfc_bsg_read_ebuf_get()
4431 return -EPIPE; in lpfc_bsg_read_ebuf_get()
4432 dmabuf = list_first_entry(&phba->mbox_ext_buf_ctx.ext_dmabuf_list, in lpfc_bsg_read_ebuf_get()
4434 list_del_init(&dmabuf->list); in lpfc_bsg_read_ebuf_get()
4437 lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType, in lpfc_bsg_read_ebuf_get()
4441 pbuf = (uint8_t *)dmabuf->virt; in lpfc_bsg_read_ebuf_get()
4442 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_read_ebuf_get()
4443 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_read_ebuf_get()
4444 job->reply_payload.sg_cnt, in lpfc_bsg_read_ebuf_get()
4449 if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) { in lpfc_bsg_read_ebuf_get()
4451 "2965 SLI_CONFIG (hbd) ext-buffer rd mbox " in lpfc_bsg_read_ebuf_get()
4456 bsg_reply->result = 0; in lpfc_bsg_read_ebuf_get()
4457 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_read_ebuf_get()
4458 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_read_ebuf_get()
4464 * lpfc_bsg_write_ebuf_set - set the next mailbox write external buffer
4475 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_write_ebuf_set()
4485 index = phba->mbox_ext_buf_ctx.seqNum; in lpfc_bsg_write_ebuf_set()
4486 phba->mbox_ext_buf_ctx.seqNum++; in lpfc_bsg_write_ebuf_set()
4487 nemb_tp = phba->mbox_ext_buf_ctx.nembType; in lpfc_bsg_write_ebuf_set()
4489 pbuf = (uint8_t *)dmabuf->virt; in lpfc_bsg_write_ebuf_set()
4490 size = job->request_payload.payload_len; in lpfc_bsg_write_ebuf_set()
4491 sg_copy_to_buffer(job->request_payload.sg_list, in lpfc_bsg_write_ebuf_set()
4492 job->request_payload.sg_cnt, in lpfc_bsg_write_ebuf_set()
4495 if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) { in lpfc_bsg_write_ebuf_set()
4497 "2966 SLI_CONFIG (mse) ext-buffer wr set " in lpfc_bsg_write_ebuf_set()
4499 phba->mbox_ext_buf_ctx.seqNum, size); in lpfc_bsg_write_ebuf_set()
4503 "2967 SLI_CONFIG (hbd) ext-buffer wr set " in lpfc_bsg_write_ebuf_set()
4505 phba->mbox_ext_buf_ctx.seqNum, size); in lpfc_bsg_write_ebuf_set()
4511 phba->mbox_ext_buf_ctx.mbx_dmabuf, in lpfc_bsg_write_ebuf_set()
4513 list_add_tail(&dmabuf->list, &phba->mbox_ext_buf_ctx.ext_dmabuf_list); in lpfc_bsg_write_ebuf_set()
4516 lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType, in lpfc_bsg_write_ebuf_set()
4520 if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) { in lpfc_bsg_write_ebuf_set()
4522 "2968 SLI_CONFIG ext-buffer wr all %d " in lpfc_bsg_write_ebuf_set()
4524 phba->mbox_ext_buf_ctx.numBuf); in lpfc_bsg_write_ebuf_set()
4528 rc = -ENOMEM; in lpfc_bsg_write_ebuf_set()
4533 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_bsg_write_ebuf_set()
4535 rc = -ENOMEM; in lpfc_bsg_write_ebuf_set()
4539 pbuf = (uint8_t *)phba->mbox_ext_buf_ctx.mbx_dmabuf->virt; in lpfc_bsg_write_ebuf_set()
4540 pmb = &pmboxq->u.mb; in lpfc_bsg_write_ebuf_set()
4542 pmb->mbxOwner = OWN_HOST; in lpfc_bsg_write_ebuf_set()
4543 pmboxq->vport = phba->pport; in lpfc_bsg_write_ebuf_set()
4545 /* callback for multi-buffer write mailbox command */ in lpfc_bsg_write_ebuf_set()
4546 pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl; in lpfc_bsg_write_ebuf_set()
4549 pmboxq->ctx_buf = dd_data; in lpfc_bsg_write_ebuf_set()
4550 dd_data->type = TYPE_MBOX; in lpfc_bsg_write_ebuf_set()
4551 dd_data->set_job = job; in lpfc_bsg_write_ebuf_set()
4552 dd_data->context_un.mbox.pmboxq = pmboxq; in lpfc_bsg_write_ebuf_set()
4553 dd_data->context_un.mbox.mb = (MAILBOX_t *)pbuf; in lpfc_bsg_write_ebuf_set()
4554 job->dd_data = dd_data; in lpfc_bsg_write_ebuf_set()
4557 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT; in lpfc_bsg_write_ebuf_set()
4562 "2969 Issued SLI_CONFIG ext-buffer " in lpfc_bsg_write_ebuf_set()
4567 "2970 Failed to issue SLI_CONFIG ext-buffer " in lpfc_bsg_write_ebuf_set()
4569 rc = -EPIPE; in lpfc_bsg_write_ebuf_set()
4574 bsg_reply->result = 0; in lpfc_bsg_write_ebuf_set()
4575 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_write_ebuf_set()
4576 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_write_ebuf_set()
4581 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_write_ebuf_set()
4589 * lpfc_bsg_handle_sli_cfg_ebuf - handle ext buffer with sli-cfg mailbox cmd
4595 * command with multiple non-embedded external buffers.
4605 phba->mbox_ext_buf_ctx.mboxType); in lpfc_bsg_handle_sli_cfg_ebuf()
4607 if (phba->mbox_ext_buf_ctx.mboxType == mbox_rd) { in lpfc_bsg_handle_sli_cfg_ebuf()
4608 if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_DONE) { in lpfc_bsg_handle_sli_cfg_ebuf()
4612 phba->mbox_ext_buf_ctx.state); in lpfc_bsg_handle_sli_cfg_ebuf()
4614 return -EPIPE; in lpfc_bsg_handle_sli_cfg_ebuf()
4619 } else { /* phba->mbox_ext_buf_ctx.mboxType == mbox_wr */ in lpfc_bsg_handle_sli_cfg_ebuf()
4620 if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_HOST) { in lpfc_bsg_handle_sli_cfg_ebuf()
4624 phba->mbox_ext_buf_ctx.state); in lpfc_bsg_handle_sli_cfg_ebuf()
4626 return -EPIPE; in lpfc_bsg_handle_sli_cfg_ebuf()
4634 * lpfc_bsg_handle_sli_cfg_ext - handle sli-cfg mailbox with external buffer
4639 * This routine checkes and handles non-embedded multi-buffer SLI_CONFIG
4646 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_handle_sli_cfg_ext()
4651 (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_handle_sli_cfg_ext()
4654 if (mbox_req->extMboxTag == 0 && mbox_req->extSeqNum == 0) in lpfc_bsg_handle_sli_cfg_ext()
4658 if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE) { in lpfc_bsg_handle_sli_cfg_ext()
4659 if (mbox_req->extSeqNum == 1) { in lpfc_bsg_handle_sli_cfg_ext()
4662 "seq:%d\n", mbox_req->extMboxTag, in lpfc_bsg_handle_sli_cfg_ext()
4663 mbox_req->extSeqNum); in lpfc_bsg_handle_sli_cfg_ext()
4675 if (mbox_req->extMboxTag != phba->mbox_ext_buf_ctx.mbxTag) in lpfc_bsg_handle_sli_cfg_ext()
4677 if (mbox_req->extSeqNum > phba->mbox_ext_buf_ctx.numBuf) in lpfc_bsg_handle_sli_cfg_ext()
4679 if (mbox_req->extSeqNum != phba->mbox_ext_buf_ctx.seqNum + 1) in lpfc_bsg_handle_sli_cfg_ext()
4685 phba->mbox_ext_buf_ctx.state, mbox_req->extMboxTag, in lpfc_bsg_handle_sli_cfg_ext()
4686 mbox_req->extSeqNum); in lpfc_bsg_handle_sli_cfg_ext()
4696 phba->mbox_ext_buf_ctx.state, in lpfc_bsg_handle_sli_cfg_ext()
4697 phba->mbox_ext_buf_ctx.numBuf, in lpfc_bsg_handle_sli_cfg_ext()
4698 phba->mbox_ext_buf_ctx.mbxTag, in lpfc_bsg_handle_sli_cfg_ext()
4699 phba->mbox_ext_buf_ctx.seqNum, in lpfc_bsg_handle_sli_cfg_ext()
4700 mbox_req->extMboxTag, mbox_req->extSeqNum); in lpfc_bsg_handle_sli_cfg_ext()
4704 return -EPIPE; in lpfc_bsg_handle_sli_cfg_ext()
4708 * lpfc_bsg_issue_mbox - issues a mailbox command on behalf of an app
4717 * being reset) and com-plete the job, otherwise issue the mailbox command and
4724 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_issue_mbox()
4725 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_issue_mbox()
4738 uint8_t *ext = NULL; in lpfc_bsg_issue_mbox() local
4744 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_issue_mbox()
4747 if (job->reply_payload.payload_len > BSG_MBOX_SIZE || in lpfc_bsg_issue_mbox()
4748 job->request_payload.payload_len > BSG_MBOX_SIZE) { in lpfc_bsg_issue_mbox()
4749 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4757 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) { in lpfc_bsg_issue_mbox()
4758 rc = -EAGAIN; in lpfc_bsg_issue_mbox()
4763 (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_issue_mbox()
4766 if ((mbox_req->inExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t)) || in lpfc_bsg_issue_mbox()
4767 (mbox_req->outExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t))) { in lpfc_bsg_issue_mbox()
4768 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4773 if (!dmabuf || !dmabuf->virt) { in lpfc_bsg_issue_mbox()
4774 rc = -ENOMEM; in lpfc_bsg_issue_mbox()
4779 pmbx = (uint8_t *)dmabuf->virt; in lpfc_bsg_issue_mbox()
4780 size = job->request_payload.payload_len; in lpfc_bsg_issue_mbox()
4781 sg_copy_to_buffer(job->request_payload.sg_list, in lpfc_bsg_issue_mbox()
4782 job->request_payload.sg_cnt, pmbx, size); in lpfc_bsg_issue_mbox()
4784 /* Handle possible SLI_CONFIG with non-embedded payloads */ in lpfc_bsg_issue_mbox()
4785 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_bsg_issue_mbox()
4803 rc = -ENOMEM; in lpfc_bsg_issue_mbox()
4807 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_bsg_issue_mbox()
4809 rc = -ENOMEM; in lpfc_bsg_issue_mbox()
4814 pmb = &pmboxq->u.mb; in lpfc_bsg_issue_mbox()
4816 pmb->mbxOwner = OWN_HOST; in lpfc_bsg_issue_mbox()
4817 pmboxq->vport = vport; in lpfc_bsg_issue_mbox()
4822 if (phba->pport->stopped && in lpfc_bsg_issue_mbox()
4823 pmb->mbxCommand != MBX_DUMP_MEMORY && in lpfc_bsg_issue_mbox()
4824 pmb->mbxCommand != MBX_RESTART && in lpfc_bsg_issue_mbox()
4825 pmb->mbxCommand != MBX_WRITE_VPARMS && in lpfc_bsg_issue_mbox()
4826 pmb->mbxCommand != MBX_WRITE_WWN) in lpfc_bsg_issue_mbox()
4830 pmb->mbxCommand); in lpfc_bsg_issue_mbox()
4833 if (mbox_req->inExtWLen || mbox_req->outExtWLen) { in lpfc_bsg_issue_mbox()
4835 ext = from + sizeof(MAILBOX_t); in lpfc_bsg_issue_mbox()
4836 pmboxq->ctx_buf = ext; in lpfc_bsg_issue_mbox()
4837 pmboxq->in_ext_byte_len = in lpfc_bsg_issue_mbox()
4838 mbox_req->inExtWLen * sizeof(uint32_t); in lpfc_bsg_issue_mbox()
4839 pmboxq->out_ext_byte_len = in lpfc_bsg_issue_mbox()
4840 mbox_req->outExtWLen * sizeof(uint32_t); in lpfc_bsg_issue_mbox()
4841 pmboxq->mbox_offset_word = mbox_req->mbOffset; in lpfc_bsg_issue_mbox()
4848 if (pmb->mbxCommand == MBX_RUN_BIU_DIAG64) { in lpfc_bsg_issue_mbox()
4849 transmit_length = pmb->un.varWords[1]; in lpfc_bsg_issue_mbox()
4850 receive_length = pmb->un.varWords[4]; in lpfc_bsg_issue_mbox()
4855 (transmit_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t))) { in lpfc_bsg_issue_mbox()
4856 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4859 pmb->un.varBIUdiag.un.s2.xmit_bde64.addrHigh = in lpfc_bsg_issue_mbox()
4860 putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t)); in lpfc_bsg_issue_mbox()
4861 pmb->un.varBIUdiag.un.s2.xmit_bde64.addrLow = in lpfc_bsg_issue_mbox()
4862 putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t)); in lpfc_bsg_issue_mbox()
4864 pmb->un.varBIUdiag.un.s2.rcv_bde64.addrHigh = in lpfc_bsg_issue_mbox()
4865 putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t) in lpfc_bsg_issue_mbox()
4866 + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize); in lpfc_bsg_issue_mbox()
4867 pmb->un.varBIUdiag.un.s2.rcv_bde64.addrLow = in lpfc_bsg_issue_mbox()
4868 putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t) in lpfc_bsg_issue_mbox()
4869 + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize); in lpfc_bsg_issue_mbox()
4870 } else if (pmb->mbxCommand == MBX_READ_EVENT_LOG) { in lpfc_bsg_issue_mbox()
4871 rdEventLog = &pmb->un.varRdEventLog; in lpfc_bsg_issue_mbox()
4872 receive_length = rdEventLog->rcv_bde64.tus.f.bdeSize; in lpfc_bsg_issue_mbox()
4878 if (receive_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t)) { in lpfc_bsg_issue_mbox()
4879 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4885 pmb->un.varWords[3] = putPaddrLow(dmabuf->phys in lpfc_bsg_issue_mbox()
4887 pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys in lpfc_bsg_issue_mbox()
4890 } else if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_bsg_issue_mbox()
4892 * returned in varwords[4-8] in lpfc_bsg_issue_mbox()
4895 if ((pmb->mbxCommand == MBX_DUMP_MEMORY) && in lpfc_bsg_issue_mbox()
4896 (pmb->un.varDmp.type != DMP_WELL_KNOWN)) { in lpfc_bsg_issue_mbox()
4900 receive_length = pmb->un.varWords[2]; in lpfc_bsg_issue_mbox()
4905 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4908 pmb->un.varWords[3] = putPaddrLow(dmabuf->phys in lpfc_bsg_issue_mbox()
4910 pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys in lpfc_bsg_issue_mbox()
4912 } else if ((pmb->mbxCommand == MBX_UPDATE_CFG) && in lpfc_bsg_issue_mbox()
4913 pmb->un.varUpdateCfg.co) { in lpfc_bsg_issue_mbox()
4914 bde = (struct ulp_bde64 *)&pmb->un.varWords[4]; in lpfc_bsg_issue_mbox()
4916 /* bde size cannot be greater than mailbox ext size */ in lpfc_bsg_issue_mbox()
4917 if (bde->tus.f.bdeSize > in lpfc_bsg_issue_mbox()
4918 BSG_MBOX_SIZE - sizeof(MAILBOX_t)) { in lpfc_bsg_issue_mbox()
4919 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4922 bde->addrHigh = putPaddrHigh(dmabuf->phys in lpfc_bsg_issue_mbox()
4924 bde->addrLow = putPaddrLow(dmabuf->phys in lpfc_bsg_issue_mbox()
4926 } else if (pmb->mbxCommand == MBX_SLI4_CONFIG) { in lpfc_bsg_issue_mbox()
4927 /* Handling non-embedded SLI_CONFIG mailbox command */ in lpfc_bsg_issue_mbox()
4928 sli4_config = &pmboxq->u.mqe.un.sli4_config; in lpfc_bsg_issue_mbox()
4930 &sli4_config->header.cfg_mhdr)) { in lpfc_bsg_issue_mbox()
4935 &pmb->un.varWords[0]; in lpfc_bsg_issue_mbox()
4936 receive_length = nembed_sge->sge[0].length; in lpfc_bsg_issue_mbox()
4943 BSG_MBOX_SIZE - sizeof(MAILBOX_t))) { in lpfc_bsg_issue_mbox()
4944 rc = -ERANGE; in lpfc_bsg_issue_mbox()
4948 nembed_sge->sge[0].pa_hi = in lpfc_bsg_issue_mbox()
4949 putPaddrHigh(dmabuf->phys in lpfc_bsg_issue_mbox()
4951 nembed_sge->sge[0].pa_lo = in lpfc_bsg_issue_mbox()
4952 putPaddrLow(dmabuf->phys in lpfc_bsg_issue_mbox()
4958 dd_data->context_un.mbox.dmabuffers = dmabuf; in lpfc_bsg_issue_mbox()
4961 pmboxq->mbox_cmpl = lpfc_bsg_issue_mbox_cmpl; in lpfc_bsg_issue_mbox()
4964 pmboxq->ctx_ndlp = dd_data; in lpfc_bsg_issue_mbox()
4965 dd_data->type = TYPE_MBOX; in lpfc_bsg_issue_mbox()
4966 dd_data->set_job = job; in lpfc_bsg_issue_mbox()
4967 dd_data->context_un.mbox.pmboxq = pmboxq; in lpfc_bsg_issue_mbox()
4968 dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx; in lpfc_bsg_issue_mbox()
4969 dd_data->context_un.mbox.ext = ext; in lpfc_bsg_issue_mbox()
4970 dd_data->context_un.mbox.mbOffset = mbox_req->mbOffset; in lpfc_bsg_issue_mbox()
4971 dd_data->context_un.mbox.inExtWLen = mbox_req->inExtWLen; in lpfc_bsg_issue_mbox()
4972 dd_data->context_un.mbox.outExtWLen = mbox_req->outExtWLen; in lpfc_bsg_issue_mbox()
4973 job->dd_data = dd_data; in lpfc_bsg_issue_mbox()
4975 if ((vport->fc_flag & FC_OFFLINE_MODE) || in lpfc_bsg_issue_mbox()
4976 (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) { in lpfc_bsg_issue_mbox()
4979 rc = (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV; in lpfc_bsg_issue_mbox()
4985 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_issue_mbox()
4986 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_issue_mbox()
4987 job->reply_payload.sg_cnt, in lpfc_bsg_issue_mbox()
5001 mempool_free(pmboxq, phba->mbox_mem_pool); in lpfc_bsg_issue_mbox()
5010 * lpfc_bsg_mbox_cmd - process an fc bsg LPFC_BSG_VENDOR_MBOX command
5017 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_mbox_cmd()
5018 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_mbox_cmd()
5019 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_mbox_cmd()
5023 /* mix-and-match backward compatibility */ in lpfc_bsg_mbox_cmd()
5024 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_mbox_cmd()
5025 if (job->request_len < in lpfc_bsg_mbox_cmd()
5028 "2737 Mix-and-match backward compatibility " in lpfc_bsg_mbox_cmd()
5031 (int)(job->request_len - in lpfc_bsg_mbox_cmd()
5035 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_mbox_cmd()
5036 mbox_req->extMboxTag = 0; in lpfc_bsg_mbox_cmd()
5037 mbox_req->extSeqNum = 0; in lpfc_bsg_mbox_cmd()
5044 bsg_reply->result = 0; in lpfc_bsg_mbox_cmd()
5045 job->dd_data = NULL; in lpfc_bsg_mbox_cmd()
5046 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_mbox_cmd()
5047 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_mbox_cmd()
5053 bsg_reply->result = rc; in lpfc_bsg_mbox_cmd()
5054 job->dd_data = NULL; in lpfc_bsg_mbox_cmd()
5061 * lpfc_bsg_menlo_cmd_cmp - lpfc_menlo_cmd completion handler
5093 dd_data = cmdiocbq->context1; in lpfc_bsg_menlo_cmd_cmp()
5094 cmp = cmdiocbq->context2; in lpfc_bsg_menlo_cmd_cmp()
5095 bmp = cmdiocbq->context3; in lpfc_bsg_menlo_cmd_cmp()
5096 menlo = &dd_data->context_un.menlo; in lpfc_bsg_menlo_cmd_cmp()
5097 rmp = menlo->rmp; in lpfc_bsg_menlo_cmd_cmp()
5098 rsp = &rspiocbq->iocb; in lpfc_bsg_menlo_cmd_cmp()
5101 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_menlo_cmd_cmp()
5102 job = dd_data->set_job; in lpfc_bsg_menlo_cmd_cmp()
5104 bsg_reply = job->reply; in lpfc_bsg_menlo_cmd_cmp()
5106 job->dd_data = NULL; in lpfc_bsg_menlo_cmd_cmp()
5108 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_menlo_cmd_cmp()
5119 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_bsg_menlo_cmd_cmp()
5120 menlo_resp->xri = rsp->ulpContext; in lpfc_bsg_menlo_cmd_cmp()
5121 if (rsp->ulpStatus) { in lpfc_bsg_menlo_cmd_cmp()
5122 if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) { in lpfc_bsg_menlo_cmd_cmp()
5123 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) { in lpfc_bsg_menlo_cmd_cmp()
5125 rc = -ETIMEDOUT; in lpfc_bsg_menlo_cmd_cmp()
5128 rc = -EFAULT; in lpfc_bsg_menlo_cmd_cmp()
5131 rc = -EACCES; in lpfc_bsg_menlo_cmd_cmp()
5135 rc = -EACCES; in lpfc_bsg_menlo_cmd_cmp()
5138 rsp_size = rsp->un.genreq64.bdl.bdeSize; in lpfc_bsg_menlo_cmd_cmp()
5139 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_menlo_cmd_cmp()
5140 lpfc_bsg_copy_data(rmp, &job->reply_payload, in lpfc_bsg_menlo_cmd_cmp()
5149 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_bsg_menlo_cmd_cmp()
5156 bsg_reply->result = rc; in lpfc_bsg_menlo_cmd_cmp()
5157 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_menlo_cmd_cmp()
5158 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_menlo_cmd_cmp()
5165 * lpfc_menlo_cmd - send an ioctl for menlo hardware
5168 * This function issues a gen request 64 CR ioctl for all menlo cmd requests,
5170 * For menlo data requests a gen request 64 CX is used to continue the exchange
5177 struct fc_bsg_request *bsg_request = job->request; in lpfc_menlo_cmd()
5178 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_menlo_cmd()
5179 struct lpfc_hba *phba = vport->phba; in lpfc_menlo_cmd()
5191 bsg_reply->reply_payload_rcv_len = 0; in lpfc_menlo_cmd()
5193 if (job->request_len < in lpfc_menlo_cmd()
5199 rc = -ERANGE; in lpfc_menlo_cmd()
5203 if (job->reply_len < sizeof(*bsg_reply) + in lpfc_menlo_cmd()
5208 rc = -ERANGE; in lpfc_menlo_cmd()
5212 if (!(phba->menlo_flag & HBA_MENLO_SUPPORT)) { in lpfc_menlo_cmd()
5216 rc = -EPERM; in lpfc_menlo_cmd()
5221 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_menlo_cmd()
5228 rc = -ENOMEM; in lpfc_menlo_cmd()
5234 rc = -ENOMEM; in lpfc_menlo_cmd()
5238 bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys); in lpfc_menlo_cmd()
5239 if (!bmp->virt) { in lpfc_menlo_cmd()
5240 rc = -ENOMEM; in lpfc_menlo_cmd()
5244 INIT_LIST_HEAD(&bmp->list); in lpfc_menlo_cmd()
5246 bpl = (struct ulp_bde64 *)bmp->virt; in lpfc_menlo_cmd()
5248 cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len, in lpfc_menlo_cmd()
5251 rc = -ENOMEM; in lpfc_menlo_cmd()
5254 lpfc_bsg_copy_data(cmp, &job->request_payload, in lpfc_menlo_cmd()
5255 job->request_payload.payload_len, 1); in lpfc_menlo_cmd()
5258 reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg; in lpfc_menlo_cmd()
5259 rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0, in lpfc_menlo_cmd()
5262 rc = -ENOMEM; in lpfc_menlo_cmd()
5268 rc = -ENOMEM; in lpfc_menlo_cmd()
5272 cmd = &cmdiocbq->iocb; in lpfc_menlo_cmd()
5273 cmd->un.genreq64.bdl.ulpIoTag32 = 0; in lpfc_menlo_cmd()
5274 cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); in lpfc_menlo_cmd()
5275 cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); in lpfc_menlo_cmd()
5276 cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; in lpfc_menlo_cmd()
5277 cmd->un.genreq64.bdl.bdeSize = in lpfc_menlo_cmd()
5279 cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA); in lpfc_menlo_cmd()
5280 cmd->un.genreq64.w5.hcsw.Dfctl = 0; in lpfc_menlo_cmd()
5281 cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CMD; in lpfc_menlo_cmd()
5282 cmd->un.genreq64.w5.hcsw.Type = MENLO_TRANSPORT_TYPE; /* 0xfe */ in lpfc_menlo_cmd()
5283 cmd->ulpBdeCount = 1; in lpfc_menlo_cmd()
5284 cmd->ulpClass = CLASS3; in lpfc_menlo_cmd()
5285 cmd->ulpOwner = OWN_CHIP; in lpfc_menlo_cmd()
5286 cmd->ulpLe = 1; /* Limited Edition */ in lpfc_menlo_cmd()
5287 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; in lpfc_menlo_cmd()
5288 cmdiocbq->vport = phba->pport; in lpfc_menlo_cmd()
5290 cmd->ulpTimeout = MENLO_TIMEOUT - 5; in lpfc_menlo_cmd()
5291 cmdiocbq->iocb_cmpl = lpfc_bsg_menlo_cmd_cmp; in lpfc_menlo_cmd()
5292 cmdiocbq->context1 = dd_data; in lpfc_menlo_cmd()
5293 cmdiocbq->context2 = cmp; in lpfc_menlo_cmd()
5294 cmdiocbq->context3 = bmp; in lpfc_menlo_cmd()
5295 if (menlo_cmd->cmd == LPFC_BSG_VENDOR_MENLO_CMD) { in lpfc_menlo_cmd()
5296 cmd->ulpCommand = CMD_GEN_REQUEST64_CR; in lpfc_menlo_cmd()
5297 cmd->ulpPU = MENLO_PU; /* 3 */ in lpfc_menlo_cmd()
5298 cmd->un.ulpWord[4] = MENLO_DID; /* 0x0000FC0E */ in lpfc_menlo_cmd()
5299 cmd->ulpContext = MENLO_CONTEXT; /* 0 */ in lpfc_menlo_cmd()
5301 cmd->ulpCommand = CMD_GEN_REQUEST64_CX; in lpfc_menlo_cmd()
5302 cmd->ulpPU = 1; in lpfc_menlo_cmd()
5303 cmd->un.ulpWord[4] = 0; in lpfc_menlo_cmd()
5304 cmd->ulpContext = menlo_cmd->xri; in lpfc_menlo_cmd()
5307 dd_data->type = TYPE_MENLO; in lpfc_menlo_cmd()
5308 dd_data->set_job = job; in lpfc_menlo_cmd()
5309 dd_data->context_un.menlo.cmdiocbq = cmdiocbq; in lpfc_menlo_cmd()
5310 dd_data->context_un.menlo.rmp = rmp; in lpfc_menlo_cmd()
5311 job->dd_data = dd_data; in lpfc_menlo_cmd()
5314 MENLO_TIMEOUT - 5); in lpfc_menlo_cmd()
5325 if (bmp->virt) in lpfc_menlo_cmd()
5326 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); in lpfc_menlo_cmd()
5332 bsg_reply->result = rc; in lpfc_menlo_cmd()
5333 job->dd_data = NULL; in lpfc_menlo_cmd()
5342 struct lpfc_hba *phba = vport->phba; in lpfc_forced_link_speed()
5343 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_forced_link_speed()
5347 if (job->request_len < in lpfc_forced_link_speed()
5353 rc = -EINVAL; in lpfc_forced_link_speed()
5358 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_forced_link_speed()
5360 if (job->reply_len < sizeof(*bsg_reply) + sizeof(*forced_reply)) { in lpfc_forced_link_speed()
5364 rc = -EINVAL; in lpfc_forced_link_speed()
5368 forced_reply->supported = (phba->hba_flag & HBA_FORCED_LINK_SPEED) in lpfc_forced_link_speed()
5372 bsg_reply->result = rc; in lpfc_forced_link_speed()
5374 bsg_job_done(job, bsg_reply->result, in lpfc_forced_link_speed()
5375 bsg_reply->reply_payload_rcv_len); in lpfc_forced_link_speed()
5390 ras_fwlog = &phba->ras_fwlog; in lpfc_check_fwlog_support()
5392 if (ras_fwlog->ras_hwsupport == false) in lpfc_check_fwlog_support()
5393 return -EACCES; in lpfc_check_fwlog_support()
5394 else if (ras_fwlog->ras_enabled == false) in lpfc_check_fwlog_support()
5395 return -EPERM; in lpfc_check_fwlog_support()
5411 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_get_ras_config()
5412 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_get_ras_config()
5414 struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog; in lpfc_bsg_get_ras_config()
5417 if (job->request_len < in lpfc_bsg_get_ras_config()
5423 rc = -EINVAL; in lpfc_bsg_get_ras_config()
5433 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_bsg_get_ras_config()
5436 spin_lock_irq(&phba->hbalock); in lpfc_bsg_get_ras_config()
5437 if (ras_fwlog->state == ACTIVE) in lpfc_bsg_get_ras_config()
5438 ras_reply->state = LPFC_RASLOG_STATE_RUNNING; in lpfc_bsg_get_ras_config()
5440 ras_reply->state = LPFC_RASLOG_STATE_STOPPED; in lpfc_bsg_get_ras_config()
5441 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_get_ras_config()
5443 ras_reply->log_level = phba->ras_fwlog.fw_loglevel; in lpfc_bsg_get_ras_config()
5444 ras_reply->log_buff_sz = phba->cfg_ras_fwlog_buffsize; in lpfc_bsg_get_ras_config()
5448 bsg_reply->result = rc; in lpfc_bsg_get_ras_config()
5452 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_get_ras_config()
5453 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_get_ras_config()
5461 * Set log-level parameters for FW-logging in host memory
5468 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_set_ras_config()
5470 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_set_ras_config()
5471 struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog; in lpfc_bsg_set_ras_config()
5472 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_set_ras_config()
5476 if (job->request_len < in lpfc_bsg_set_ras_config()
5482 rc = -EINVAL; in lpfc_bsg_set_ras_config()
5492 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_set_ras_config()
5493 action = ras_req->action; in lpfc_bsg_set_ras_config()
5494 log_level = ras_req->log_level; in lpfc_bsg_set_ras_config()
5498 spin_lock_irq(&phba->hbalock); in lpfc_bsg_set_ras_config()
5499 if (ras_fwlog->state != ACTIVE) { in lpfc_bsg_set_ras_config()
5500 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_set_ras_config()
5501 rc = -ESRCH; in lpfc_bsg_set_ras_config()
5504 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_set_ras_config()
5511 /* Even though FW-logging is active re-initialize in lpfc_bsg_set_ras_config()
5512 * FW-logging with new log-level. Return status in lpfc_bsg_set_ras_config()
5515 spin_lock_irq(&phba->hbalock); in lpfc_bsg_set_ras_config()
5516 if (ras_fwlog->state != INACTIVE) in lpfc_bsg_set_ras_config()
5517 action_status = -EINPROGRESS; in lpfc_bsg_set_ras_config()
5518 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_set_ras_config()
5524 rc = -EINVAL; in lpfc_bsg_set_ras_config()
5528 /* Check if FW-logging is re-initialized */ in lpfc_bsg_set_ras_config()
5529 if (action_status == -EINPROGRESS) in lpfc_bsg_set_ras_config()
5534 bsg_reply->result = rc; in lpfc_bsg_set_ras_config()
5538 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_set_ras_config()
5539 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_set_ras_config()
5557 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_get_ras_lwpd()
5558 struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog; in lpfc_bsg_get_ras_lwpd()
5559 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_get_ras_lwpd()
5567 if (job->request_len < in lpfc_bsg_get_ras_lwpd()
5573 rc = -EINVAL; in lpfc_bsg_get_ras_lwpd()
5578 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_bsg_get_ras_lwpd()
5580 if (!ras_fwlog->lwpd.virt) { in lpfc_bsg_get_ras_lwpd()
5583 rc = -EINVAL; in lpfc_bsg_get_ras_lwpd()
5588 lwpd_ptr = (uint32_t *)(ras_fwlog->lwpd.virt); in lpfc_bsg_get_ras_lwpd()
5589 ras_reply->offset = be32_to_cpu(*lwpd_ptr & 0xffffffff); in lpfc_bsg_get_ras_lwpd()
5592 ras_reply->wrap_count = be32_to_cpu(*(++lwpd_ptr) & 0xffffffff); in lpfc_bsg_get_ras_lwpd()
5596 bsg_reply->result = rc; in lpfc_bsg_get_ras_lwpd()
5600 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_get_ras_lwpd()
5601 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_get_ras_lwpd()
5617 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_get_ras_fwlog()
5618 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_get_ras_fwlog()
5619 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_get_ras_fwlog()
5627 ras_fwlog = &phba->ras_fwlog; in lpfc_bsg_get_ras_fwlog()
5634 spin_lock_irq(&phba->hbalock); in lpfc_bsg_get_ras_fwlog()
5635 if (ras_fwlog->state == ACTIVE) { in lpfc_bsg_get_ras_fwlog()
5636 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_get_ras_fwlog()
5637 rc = -EINPROGRESS; in lpfc_bsg_get_ras_fwlog()
5640 spin_unlock_irq(&phba->hbalock); in lpfc_bsg_get_ras_fwlog()
5642 if (job->request_len < in lpfc_bsg_get_ras_fwlog()
5648 rc = -EINVAL; in lpfc_bsg_get_ras_fwlog()
5653 bsg_request->rqst_data.h_vendor.vendor_cmd; in lpfc_bsg_get_ras_fwlog()
5654 rd_offset = ras_req->read_offset; in lpfc_bsg_get_ras_fwlog()
5657 fwlog_buff = vmalloc(ras_req->read_size); in lpfc_bsg_get_ras_fwlog()
5659 rc = -ENOMEM; in lpfc_bsg_get_ras_fwlog()
5667 &ras_fwlog->fwlog_buff_list, list) { in lpfc_bsg_get_ras_fwlog()
5669 if (dmabuf->buffer_tag < rd_index) in lpfc_bsg_get_ras_fwlog()
5672 src = dmabuf->virt + offset; in lpfc_bsg_get_ras_fwlog()
5673 memcpy(fwlog_buff, src, ras_req->read_size); in lpfc_bsg_get_ras_fwlog()
5677 bsg_reply->reply_payload_rcv_len = in lpfc_bsg_get_ras_fwlog()
5678 sg_copy_from_buffer(job->reply_payload.sg_list, in lpfc_bsg_get_ras_fwlog()
5679 job->reply_payload.sg_cnt, in lpfc_bsg_get_ras_fwlog()
5680 fwlog_buff, ras_req->read_size); in lpfc_bsg_get_ras_fwlog()
5685 bsg_reply->result = rc; in lpfc_bsg_get_ras_fwlog()
5687 bsg_job_done(job, bsg_reply->result, in lpfc_bsg_get_ras_fwlog()
5688 bsg_reply->reply_payload_rcv_len); in lpfc_bsg_get_ras_fwlog()
5697 struct lpfc_hba *phba = vport->phba; in lpfc_get_trunk_info()
5698 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_get_trunk_info()
5702 if (job->request_len < in lpfc_get_trunk_info()
5707 rc = -EINVAL; in lpfc_get_trunk_info()
5712 bsg_reply->reply_data.vendor_reply.vendor_rsp; in lpfc_get_trunk_info()
5714 if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) { in lpfc_get_trunk_info()
5718 rc = -EINVAL; in lpfc_get_trunk_info()
5722 rc = -EINVAL; in lpfc_get_trunk_info()
5727 (phba->link_state >= LPFC_LINK_UP) ? 1 : 0); in lpfc_get_trunk_info()
5730 (phba->trunk_link.link0.state == LPFC_LINK_UP) ? 1 : 0); in lpfc_get_trunk_info()
5733 (phba->trunk_link.link1.state == LPFC_LINK_UP) ? 1 : 0); in lpfc_get_trunk_info()
5736 (phba->trunk_link.link2.state == LPFC_LINK_UP) ? 1 : 0); in lpfc_get_trunk_info()
5739 (phba->trunk_link.link3.state == LPFC_LINK_UP) ? 1 : 0); in lpfc_get_trunk_info()
5742 bf_get(lpfc_conf_trunk_port0, &phba->sli4_hba)); in lpfc_get_trunk_info()
5745 bf_get(lpfc_conf_trunk_port1, &phba->sli4_hba)); in lpfc_get_trunk_info()
5748 bf_get(lpfc_conf_trunk_port2, &phba->sli4_hba)); in lpfc_get_trunk_info()
5751 bf_get(lpfc_conf_trunk_port3, &phba->sli4_hba)); in lpfc_get_trunk_info()
5753 event_reply->port_speed = phba->sli4_hba.link_state.speed / 1000; in lpfc_get_trunk_info()
5754 event_reply->logical_speed = in lpfc_get_trunk_info()
5755 phba->sli4_hba.link_state.logical_speed / 1000; in lpfc_get_trunk_info()
5757 bsg_reply->result = rc; in lpfc_get_trunk_info()
5759 bsg_job_done(job, bsg_reply->result, in lpfc_get_trunk_info()
5760 bsg_reply->reply_payload_rcv_len); in lpfc_get_trunk_info()
5766 * lpfc_bsg_hst_vendor - process a vendor-specific fc_bsg_job
5772 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_hst_vendor()
5773 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_hst_vendor()
5774 int command = bsg_request->rqst_data.h_vendor.vendor_cmd[0]; in lpfc_bsg_hst_vendor()
5828 rc = -EINVAL; in lpfc_bsg_hst_vendor()
5829 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_hst_vendor()
5831 bsg_reply->result = rc; in lpfc_bsg_hst_vendor()
5839 * lpfc_bsg_request - handle a bsg request from the FC transport
5845 struct fc_bsg_request *bsg_request = job->request; in lpfc_bsg_request()
5846 struct fc_bsg_reply *bsg_reply = job->reply; in lpfc_bsg_request()
5850 msgcode = bsg_request->msgcode; in lpfc_bsg_request()
5862 rc = -EINVAL; in lpfc_bsg_request()
5863 bsg_reply->reply_payload_rcv_len = 0; in lpfc_bsg_request()
5865 bsg_reply->result = rc; in lpfc_bsg_request()
5873 * lpfc_bsg_timeout - handle timeout of a bsg request from the FC transport
5883 struct lpfc_hba *phba = vport->phba; in lpfc_bsg_timeout()
5894 return -EIO; in lpfc_bsg_timeout()
5905 spin_lock_irqsave(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5906 dd_data = (struct bsg_job_data *)job->dd_data; in lpfc_bsg_timeout()
5908 dd_data->set_job = NULL; in lpfc_bsg_timeout()
5909 job->dd_data = NULL; in lpfc_bsg_timeout()
5911 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5912 return -EAGAIN; in lpfc_bsg_timeout()
5915 switch (dd_data->type) { in lpfc_bsg_timeout()
5921 cmdiocb = dd_data->context_un.iocb.cmdiocbq; in lpfc_bsg_timeout()
5922 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5924 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_timeout()
5926 if (!(cmdiocb->iocb_flag & LPFC_IO_CMD_OUTSTANDING)) { in lpfc_bsg_timeout()
5927 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_timeout()
5928 return -EAGAIN; in lpfc_bsg_timeout()
5930 list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq, in lpfc_bsg_timeout()
5933 list_move_tail(&check_iocb->list, &completions); in lpfc_bsg_timeout()
5939 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_timeout()
5948 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5952 /* Update the ext buf ctx state if needed */ in lpfc_bsg_timeout()
5954 if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT) in lpfc_bsg_timeout()
5955 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS; in lpfc_bsg_timeout()
5956 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5963 cmdiocb = dd_data->context_un.menlo.cmdiocbq; in lpfc_bsg_timeout()
5964 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()
5966 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_bsg_timeout()
5967 list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq, in lpfc_bsg_timeout()
5970 list_move_tail(&check_iocb->list, &completions); in lpfc_bsg_timeout()
5976 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_bsg_timeout()
5984 spin_unlock_irqrestore(&phba->ct_ev_lock, flags); in lpfc_bsg_timeout()