scsi: lpfc: NVME Target: bind to nvmet_fc api
NVME Target: Tie in to NVME Fabrics nvmet_fc LLDD target api Adds the routines to: - register and deregister the FC port as a nvmet-fc targetport - binding of nvme queues to adapter WQs - receipt and passing of NVME LS's to transport, sending transport response - receipt of NVME FCP CMD IUs, processing FCP target io data transmission commands; transmission of FCP io response - Abort operations for tgt io exchanges [mkp: fixed space at end of file warning] Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
8c258641e0
commit
d613b6a7aa
|
@ -31,4 +31,4 @@ obj-$(CONFIG_SCSI_LPFC) := lpfc.o
|
|||
lpfc-objs := lpfc_mem.o lpfc_sli.o lpfc_ct.o lpfc_els.o \
|
||||
lpfc_hbadisc.o lpfc_init.o lpfc_mbox.o lpfc_nportdisc.o \
|
||||
lpfc_scsi.o lpfc_attr.o lpfc_vport.o lpfc_debugfs.o lpfc_bsg.o \
|
||||
lpfc_nvme.o
|
||||
lpfc_nvme.o lpfc_nvmet.o
|
||||
|
|
|
@ -363,6 +363,8 @@ void *lpfc_nvmet_buf_alloc(struct lpfc_hba *phba, int flags,
|
|||
void lpfc_nvmet_buf_free(struct lpfc_hba *phba, void *virtp, dma_addr_t dma);
|
||||
|
||||
void lpfc_in_buf_free(struct lpfc_hba *, struct lpfc_dmabuf *);
|
||||
void lpfc_rq_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp);
|
||||
|
||||
/* Function prototypes. */
|
||||
const char* lpfc_info(struct Scsi_Host *);
|
||||
int lpfc_scan_finished(struct Scsi_Host *, unsigned long);
|
||||
|
@ -536,6 +538,14 @@ int lpfc_nvme_register_port(struct lpfc_vport *vport,
|
|||
int lpfc_nvme_create_localport(struct lpfc_vport *vport);
|
||||
void lpfc_nvme_destroy_localport(struct lpfc_vport *vport);
|
||||
void lpfc_nvme_update_localport(struct lpfc_vport *vport);
|
||||
int lpfc_nvmet_create_targetport(struct lpfc_hba *phba);
|
||||
int lpfc_nvmet_update_targetport(struct lpfc_hba *phba);
|
||||
void lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba);
|
||||
void lpfc_nvmet_unsol_ls_event(struct lpfc_hba *phba,
|
||||
struct lpfc_sli_ring *pring, struct lpfc_iocbq *piocb);
|
||||
void lpfc_nvmet_unsol_fcp_event(struct lpfc_hba *phba,
|
||||
struct lpfc_sli_ring *pring,
|
||||
struct rqb_dmabuf *nvmebuf, uint64_t isr_ts);
|
||||
void lpfc_nvme_mod_param_dep(struct lpfc_hba *phba);
|
||||
void lpfc_nvme_abort_fcreq_cmpl(struct lpfc_hba *phba,
|
||||
struct lpfc_iocbq *cmdiocb,
|
||||
|
|
|
@ -1436,7 +1436,7 @@ lpfc_ns_cmd(struct lpfc_vport *vport, int cmdcode,
|
|||
if ((vport == phba->pport) && phba->nvmet_support) {
|
||||
CtReq->un.rff.fbits = (FC4_FEATURE_TARGET |
|
||||
FC4_FEATURE_NVME_DISC);
|
||||
/* todo: update targetport attributes */
|
||||
lpfc_nvmet_update_targetport(phba);
|
||||
} else {
|
||||
lpfc_nvme_update_localport(vport);
|
||||
}
|
||||
|
|
|
@ -2636,9 +2636,10 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
|
||||
if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
|
||||
(phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
|
||||
if (!phba->nvmet_support)
|
||||
if (phba->nvmet_support)
|
||||
lpfc_nvmet_update_targetport(phba);
|
||||
else
|
||||
lpfc_nvme_update_localport(phba->pport);
|
||||
/* todo: tgt: update targetport attributes */
|
||||
}
|
||||
|
||||
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
|
|
|
@ -911,9 +911,10 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
|||
|
||||
if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
|
||||
(phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
|
||||
if (!phba->nvmet_support)
|
||||
if (phba->nvmet_support)
|
||||
lpfc_nvmet_update_targetport(phba);
|
||||
else
|
||||
lpfc_nvme_update_localport(vports[i]);
|
||||
/* todo: tgt: update targetport attributes */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3587,9 +3588,10 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
|||
|
||||
if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
|
||||
(phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
|
||||
if (!phba->nvmet_support)
|
||||
if (phba->nvmet_support)
|
||||
lpfc_nvmet_update_targetport(phba);
|
||||
else
|
||||
lpfc_nvme_update_localport(vport);
|
||||
/* todo: update targetport attributes */
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -10397,7 +10397,13 @@ lpfc_pci_remove_one_s3(struct pci_dev *pdev)
|
|||
/* Remove FC host and then SCSI host with the physical port */
|
||||
fc_remove_host(shost);
|
||||
scsi_remove_host(shost);
|
||||
|
||||
/* Perform ndlp cleanup on the physical port. The nvme and nvmet
|
||||
* localports are destroyed after to cleanup all transport memory.
|
||||
*/
|
||||
lpfc_cleanup(vport);
|
||||
lpfc_nvmet_destroy_targetport(phba);
|
||||
lpfc_nvme_destroy_localport(vport);
|
||||
|
||||
/*
|
||||
* Bring down the SLI Layer. This step disable all interrupts,
|
||||
|
@ -11203,13 +11209,13 @@ lpfc_pci_remove_one_s4(struct pci_dev *pdev)
|
|||
/* Remove FC host and then SCSI host with the physical port */
|
||||
fc_remove_host(shost);
|
||||
scsi_remove_host(shost);
|
||||
/* todo: tgt: remove targetport */
|
||||
|
||||
/* Perform ndlp cleanup on the physical port. The nvme localport
|
||||
* is destroyed after to ensure all rports are io-disabled.
|
||||
/* Perform ndlp cleanup on the physical port. The nvme and nvmet
|
||||
* localports are destroyed after to cleanup all transport memory.
|
||||
*/
|
||||
lpfc_nvme_destroy_localport(vport);
|
||||
lpfc_cleanup(vport);
|
||||
lpfc_nvmet_destroy_targetport(phba);
|
||||
lpfc_nvme_destroy_localport(vport);
|
||||
|
||||
/*
|
||||
* Bring down the SLI Layer. This step disables all interrupts,
|
||||
|
|
|
@ -763,3 +763,48 @@ lpfc_in_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_rq_buf_free - Free a RQ DMA buffer
|
||||
* @phba: HBA buffer is associated with
|
||||
* @mp: Buffer to free
|
||||
*
|
||||
* Description: Frees the given DMA buffer in the appropriate way given by
|
||||
* reposting it to its associated RQ so it can be reused.
|
||||
*
|
||||
* Notes: Takes phba->hbalock. Can be called with or without other locks held.
|
||||
*
|
||||
* Returns: None
|
||||
**/
|
||||
void
|
||||
lpfc_rq_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp)
|
||||
{
|
||||
struct lpfc_rqb *rqbp;
|
||||
struct lpfc_rqe hrqe;
|
||||
struct lpfc_rqe drqe;
|
||||
struct rqb_dmabuf *rqb_entry;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
if (!mp)
|
||||
return;
|
||||
|
||||
rqb_entry = container_of(mp, struct rqb_dmabuf, hbuf);
|
||||
rqbp = rqb_entry->hrq->rqbp;
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, flags);
|
||||
list_del(&rqb_entry->hbuf.list);
|
||||
hrqe.address_lo = putPaddrLow(rqb_entry->hbuf.phys);
|
||||
hrqe.address_hi = putPaddrHigh(rqb_entry->hbuf.phys);
|
||||
drqe.address_lo = putPaddrLow(rqb_entry->dbuf.phys);
|
||||
drqe.address_hi = putPaddrHigh(rqb_entry->dbuf.phys);
|
||||
rc = lpfc_sli4_rq_put(rqb_entry->hrq, rqb_entry->drq, &hrqe, &drqe);
|
||||
if (rc < 0) {
|
||||
(rqbp->rqb_free_buffer)(phba, rqb_entry);
|
||||
} else {
|
||||
list_add_tail(&rqb_entry->hbuf.list, &rqbp->rqb_buffer_list);
|
||||
rqbp->buffer_count++;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2518,7 +2518,7 @@ lpfc_complete_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
|||
|
||||
switch (fch_type) {
|
||||
case FC_TYPE_NVME:
|
||||
/* todo: tgt: forward NVME LS to transport */
|
||||
lpfc_nvmet_unsol_ls_event(phba, pring, saveq);
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
|
@ -6867,7 +6867,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|||
goto out_destroy_queue;
|
||||
}
|
||||
phba->sli4_hba.nvmet_xri_cnt = rc;
|
||||
/* todo: tgt: create targetport */
|
||||
lpfc_nvmet_create_targetport(phba);
|
||||
} else {
|
||||
/* update host scsi xri-sgl sizes and mappings */
|
||||
rc = lpfc_sli4_scsi_sgl_update(phba);
|
||||
|
@ -13137,7 +13137,9 @@ lpfc_sli4_nvmet_handle_rcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
|
|||
|
||||
if (fc_hdr->fh_type == FC_TYPE_FCP) {
|
||||
dma_buf->bytes_recv = bf_get(lpfc_rcqe_length, rcqe);
|
||||
/* todo: tgt: forward cmd iu to transport */
|
||||
lpfc_nvmet_unsol_fcp_event(
|
||||
phba, phba->sli4_hba.els_wq->pring, dma_buf,
|
||||
cq->assoc_qp->isr_timestamp);
|
||||
return false;
|
||||
}
|
||||
drop:
|
||||
|
|
Loading…
Reference in New Issue