Lines Matching defs:qp

651 nvme_free_qpair(nvme_qpair_t *qp)
655 mutex_destroy(&qp->nq_mutex);
657 if (qp->nq_sqdma != NULL)
658 nvme_free_dma(qp->nq_sqdma);
659 if (qp->nq_cqdma != NULL)
660 nvme_free_dma(qp->nq_cqdma);
662 if (qp->nq_active_cmds > 0)
663 for (i = 0; i != qp->nq_nentry; i++)
664 if (qp->nq_cmd[i] != NULL)
665 nvme_free_cmd(qp->nq_cmd[i]);
667 if (qp->nq_cmd != NULL)
668 kmem_free(qp->nq_cmd, sizeof (nvme_cmd_t *) * qp->nq_nentry);
670 kmem_free(qp, sizeof (nvme_qpair_t));
677 nvme_qpair_t *qp = kmem_zalloc(sizeof (*qp), KM_SLEEP);
679 mutex_init(&qp->nq_mutex, NULL, MUTEX_DRIVER,
683 DDI_DMA_WRITE, &qp->nq_sqdma) != DDI_SUCCESS)
687 DDI_DMA_READ, &qp->nq_cqdma) != DDI_SUCCESS)
690 qp->nq_sq = (nvme_sqe_t *)qp->nq_sqdma->nd_memp;
691 qp->nq_cq = (nvme_cqe_t *)qp->nq_cqdma->nd_memp;
692 qp->nq_nentry = nentry;
694 qp->nq_sqtdbl = NVME_REG_SQTDBL(nvme, idx);
695 qp->nq_cqhdbl = NVME_REG_CQHDBL(nvme, idx);
697 qp->nq_cmd = kmem_zalloc(sizeof (nvme_cmd_t *) * nentry, KM_SLEEP);
698 qp->nq_next_cmd = 0;
700 *nqp = qp;
704 nvme_free_qpair(qp);
748 nvme_submit_cmd(nvme_qpair_t *qp, nvme_cmd_t *cmd)
752 mutex_enter(&qp->nq_mutex);
754 if (qp->nq_active_cmds == qp->nq_nentry) {
755 mutex_exit(&qp->nq_mutex);
767 while (qp->nq_cmd[qp->nq_next_cmd] != NULL)
768 qp->nq_next_cmd = (qp->nq_next_cmd + 1) % qp->nq_nentry;
769 qp->nq_cmd[qp->nq_next_cmd] = cmd;
771 qp->nq_active_cmds++;
773 cmd->nc_sqe.sqe_cid = qp->nq_next_cmd;
774 bcopy(&cmd->nc_sqe, &qp->nq_sq[qp->nq_sqtail], sizeof (nvme_sqe_t));
775 (void) ddi_dma_sync(qp->nq_sqdma->nd_dmah,
776 sizeof (nvme_sqe_t) * qp->nq_sqtail,
778 qp->nq_next_cmd = (qp->nq_next_cmd + 1) % qp->nq_nentry;
780 tail.b.sqtdbl_sqt = qp->nq_sqtail = (qp->nq_sqtail + 1) % qp->nq_nentry;
781 nvme_put32(cmd->nc_nvme, qp->nq_sqtdbl, tail.r);
783 mutex_exit(&qp->nq_mutex);
788 nvme_retrieve_cmd(nvme_t *nvme, nvme_qpair_t *qp)
795 (void) ddi_dma_sync(qp->nq_cqdma->nd_dmah, 0,
796 sizeof (nvme_cqe_t) * qp->nq_nentry, DDI_DMA_SYNC_FORKERNEL);
798 cqe = &qp->nq_cq[qp->nq_cqhead];
801 if (cqe->cqe_sf.sf_p == qp->nq_phase)
804 ASSERT(nvme->n_ioq[cqe->cqe_sqid] == qp);
805 ASSERT(cqe->cqe_cid < qp->nq_nentry);
807 mutex_enter(&qp->nq_mutex);
808 cmd = qp->nq_cmd[cqe->cqe_cid];
809 qp->nq_cmd[cqe->cqe_cid] = NULL;
810 qp->nq_active_cmds--;
811 mutex_exit(&qp->nq_mutex);
819 qp->nq_sqhead = cqe->cqe_sqhd;
821 head.b.cqhdbl_cqh = qp->nq_cqhead = (qp->nq_cqhead + 1) % qp->nq_nentry;
824 if (qp->nq_cqhead == 0)
825 qp->nq_phase = qp->nq_phase ? 0 : 1;
827 nvme_put32(cmd->nc_nvme, qp->nq_cqhdbl, head.r);
1715 nvme_create_io_qpair(nvme_t *nvme, nvme_qpair_t *qp, uint16_t idx)
1723 dw10.b.q_qsize = qp->nq_nentry - 1;
1734 cmd->nc_sqe.sqe_dptr.d_prp[0] = qp->nq_cqdma->nd_cookie.dmac_laddress;
1761 cmd->nc_sqe.sqe_dptr.d_prp[0] = qp->nq_sqdma->nd_cookie.dmac_laddress;