scsi: lpfc: Rework lpfc Kconfig for NVME options
Reworked Kconfig so that lfpc only requires the scsi stack. NVME Initiator and NVME Target support can be enabled if the other NVMe subsystems have been enabled. Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
856984b71c
commit
166d721120
@ -1241,19 +1241,32 @@ config SCSI_LPFC
|
|||||||
tristate "Emulex LightPulse Fibre Channel Support"
|
tristate "Emulex LightPulse Fibre Channel Support"
|
||||||
depends on PCI && SCSI
|
depends on PCI && SCSI
|
||||||
depends on SCSI_FC_ATTRS
|
depends on SCSI_FC_ATTRS
|
||||||
depends on NVME_FC && NVME_TARGET_FC
|
|
||||||
select CRC_T10DIF
|
select CRC_T10DIF
|
||||||
help
|
---help---
|
||||||
This lpfc driver supports the Emulex LightPulse
|
This lpfc driver supports the Emulex LightPulse
|
||||||
Family of Fibre Channel PCI host adapters.
|
Family of Fibre Channel PCI host adapters.
|
||||||
|
|
||||||
config SCSI_LPFC_DEBUG_FS
|
config SCSI_LPFC_DEBUG_FS
|
||||||
bool "Emulex LightPulse Fibre Channel debugfs Support"
|
bool "Emulex LightPulse Fibre Channel debugfs Support"
|
||||||
depends on SCSI_LPFC && DEBUG_FS
|
depends on SCSI_LPFC && DEBUG_FS
|
||||||
help
|
---help---
|
||||||
This makes debugging information from the lpfc driver
|
This makes debugging information from the lpfc driver
|
||||||
available via the debugfs filesystem.
|
available via the debugfs filesystem.
|
||||||
|
|
||||||
|
config LPFC_NVME_INITIATOR
|
||||||
|
bool "Emulex LightPulse Fibre Channel NVME Initiator Support"
|
||||||
|
depends on SCSI_LPFC && NVME_FC
|
||||||
|
---help---
|
||||||
|
This enables NVME Initiator support in the Emulex lpfc driver.
|
||||||
|
|
||||||
|
config LPFC_NVME_TARGET
|
||||||
|
bool "Emulex LightPulse Fibre Channel NVME Initiator Support"
|
||||||
|
depends on SCSI_LPFC && NVME_TARGET_FC
|
||||||
|
---help---
|
||||||
|
This enables NVME Target support in the Emulex lpfc driver.
|
||||||
|
Target enablement must still be enabled on a per adapter
|
||||||
|
basis by module parameters.
|
||||||
|
|
||||||
config SCSI_SIM710
|
config SCSI_SIM710
|
||||||
tristate "Simple 53c710 SCSI support (Compaq, NCR machines)"
|
tristate "Simple 53c710 SCSI support (Compaq, NCR machines)"
|
||||||
depends on (EISA || MCA) && SCSI
|
depends on (EISA || MCA) && SCSI
|
||||||
|
@ -2127,11 +2127,12 @@ lpfc_release_nvme_buf(struct lpfc_hba *phba, struct lpfc_nvme_buf *lpfc_ncmd)
|
|||||||
int
|
int
|
||||||
lpfc_nvme_create_localport(struct lpfc_vport *vport)
|
lpfc_nvme_create_localport(struct lpfc_vport *vport)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
struct lpfc_hba *phba = vport->phba;
|
struct lpfc_hba *phba = vport->phba;
|
||||||
struct nvme_fc_port_info nfcp_info;
|
struct nvme_fc_port_info nfcp_info;
|
||||||
struct nvme_fc_local_port *localport;
|
struct nvme_fc_local_port *localport;
|
||||||
struct lpfc_nvme_lport *lport;
|
struct lpfc_nvme_lport *lport;
|
||||||
int len, ret = 0;
|
int len;
|
||||||
|
|
||||||
/* Initialize this localport instance. The vport wwn usage ensures
|
/* Initialize this localport instance. The vport wwn usage ensures
|
||||||
* that NPIV is accounted for.
|
* that NPIV is accounted for.
|
||||||
@ -2148,8 +2149,12 @@ lpfc_nvme_create_localport(struct lpfc_vport *vport)
|
|||||||
/* localport is allocated from the stack, but the registration
|
/* localport is allocated from the stack, but the registration
|
||||||
* call allocates heap memory as well as the private area.
|
* call allocates heap memory as well as the private area.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_LPFC_NVME_INITIATOR
|
||||||
ret = nvme_fc_register_localport(&nfcp_info, &lpfc_nvme_template,
|
ret = nvme_fc_register_localport(&nfcp_info, &lpfc_nvme_template,
|
||||||
&vport->phba->pcidev->dev, &localport);
|
&vport->phba->pcidev->dev, &localport);
|
||||||
|
#else
|
||||||
|
ret = -ENOMEM;
|
||||||
|
#endif
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME | LOG_NVME_DISC,
|
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME | LOG_NVME_DISC,
|
||||||
"6005 Successfully registered local "
|
"6005 Successfully registered local "
|
||||||
@ -2185,6 +2190,7 @@ lpfc_nvme_create_localport(struct lpfc_vport *vport)
|
|||||||
void
|
void
|
||||||
lpfc_nvme_destroy_localport(struct lpfc_vport *vport)
|
lpfc_nvme_destroy_localport(struct lpfc_vport *vport)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_INITIATOR
|
||||||
struct nvme_fc_local_port *localport;
|
struct nvme_fc_local_port *localport;
|
||||||
struct lpfc_nvme_lport *lport;
|
struct lpfc_nvme_lport *lport;
|
||||||
struct lpfc_nvme_rport *rport = NULL, *rport_next = NULL;
|
struct lpfc_nvme_rport *rport = NULL, *rport_next = NULL;
|
||||||
@ -2200,7 +2206,6 @@ lpfc_nvme_destroy_localport(struct lpfc_vport *vport)
|
|||||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME,
|
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME,
|
||||||
"6011 Destroying NVME localport %p\n",
|
"6011 Destroying NVME localport %p\n",
|
||||||
localport);
|
localport);
|
||||||
|
|
||||||
list_for_each_entry_safe(rport, rport_next, &lport->rport_list, list) {
|
list_for_each_entry_safe(rport, rport_next, &lport->rport_list, list) {
|
||||||
/* The last node ref has to get released now before the rport
|
/* The last node ref has to get released now before the rport
|
||||||
* private memory area is released by the transport.
|
* private memory area is released by the transport.
|
||||||
@ -2214,6 +2219,7 @@ lpfc_nvme_destroy_localport(struct lpfc_vport *vport)
|
|||||||
"6008 rport fail destroy %x\n", ret);
|
"6008 rport fail destroy %x\n", ret);
|
||||||
wait_for_completion_timeout(&rport->rport_unreg_done, 5);
|
wait_for_completion_timeout(&rport->rport_unreg_done, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lport's rport list is clear. Unregister
|
/* lport's rport list is clear. Unregister
|
||||||
* lport and release resources.
|
* lport and release resources.
|
||||||
*/
|
*/
|
||||||
@ -2237,6 +2243,7 @@ lpfc_nvme_destroy_localport(struct lpfc_vport *vport)
|
|||||||
"Failed, status x%x\n",
|
"Failed, status x%x\n",
|
||||||
ret);
|
ret);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -2267,6 +2274,7 @@ lpfc_nvme_update_localport(struct lpfc_vport *vport)
|
|||||||
int
|
int
|
||||||
lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_INITIATOR
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct nvme_fc_local_port *localport;
|
struct nvme_fc_local_port *localport;
|
||||||
struct lpfc_nvme_lport *lport;
|
struct lpfc_nvme_lport *lport;
|
||||||
@ -2340,7 +2348,6 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
|||||||
rpinfo.port_role |= FC_PORT_ROLE_NVME_INITIATOR;
|
rpinfo.port_role |= FC_PORT_ROLE_NVME_INITIATOR;
|
||||||
rpinfo.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn);
|
rpinfo.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn);
|
||||||
rpinfo.node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn);
|
rpinfo.node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn);
|
||||||
|
|
||||||
ret = nvme_fc_register_remoteport(localport, &rpinfo,
|
ret = nvme_fc_register_remoteport(localport, &rpinfo,
|
||||||
&remote_port);
|
&remote_port);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
@ -2376,6 +2383,9 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
|||||||
ndlp->nlp_type, ndlp->nlp_DID, ndlp);
|
ndlp->nlp_type, ndlp->nlp_DID, ndlp);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lpfc_nvme_unregister_port - unbind the DID and port_role from this rport.
|
/* lpfc_nvme_unregister_port - unbind the DID and port_role from this rport.
|
||||||
@ -2393,6 +2403,7 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
|||||||
void
|
void
|
||||||
lpfc_nvme_unregister_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
lpfc_nvme_unregister_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_INITIATOR
|
||||||
int ret;
|
int ret;
|
||||||
struct nvme_fc_local_port *localport;
|
struct nvme_fc_local_port *localport;
|
||||||
struct lpfc_nvme_lport *lport;
|
struct lpfc_nvme_lport *lport;
|
||||||
@ -2450,6 +2461,7 @@ lpfc_nvme_unregister_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
input_err:
|
input_err:
|
||||||
|
#endif
|
||||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_DISC,
|
lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_DISC,
|
||||||
"6168: State error: lport %p, rport%p FCID x%06x\n",
|
"6168: State error: lport %p, rport%p FCID x%06x\n",
|
||||||
vport->localport, ndlp->rport, ndlp->nlp_DID);
|
vport->localport, ndlp->rport, ndlp->nlp_DID);
|
||||||
|
@ -671,9 +671,13 @@ lpfc_nvmet_create_targetport(struct lpfc_hba *phba)
|
|||||||
lpfc_tgttemplate.target_features = NVMET_FCTGTFEAT_READDATA_RSP |
|
lpfc_tgttemplate.target_features = NVMET_FCTGTFEAT_READDATA_RSP |
|
||||||
NVMET_FCTGTFEAT_NEEDS_CMD_CPUSCHED;
|
NVMET_FCTGTFEAT_NEEDS_CMD_CPUSCHED;
|
||||||
|
|
||||||
|
#ifdef CONFIG_LPFC_NVME_TARGET
|
||||||
error = nvmet_fc_register_targetport(&pinfo, &lpfc_tgttemplate,
|
error = nvmet_fc_register_targetport(&pinfo, &lpfc_tgttemplate,
|
||||||
&phba->pcidev->dev,
|
&phba->pcidev->dev,
|
||||||
&phba->targetport);
|
&phba->targetport);
|
||||||
|
#else
|
||||||
|
error = -ENOMEM;
|
||||||
|
#endif
|
||||||
if (error) {
|
if (error) {
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
|
lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
|
||||||
"6025 Cannot register NVME targetport "
|
"6025 Cannot register NVME targetport "
|
||||||
@ -752,6 +756,7 @@ lpfc_sli4_nvmet_xri_aborted(struct lpfc_hba *phba,
|
|||||||
void
|
void
|
||||||
lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba)
|
lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_TARGET
|
||||||
struct lpfc_nvmet_tgtport *tgtp;
|
struct lpfc_nvmet_tgtport *tgtp;
|
||||||
|
|
||||||
if (phba->nvmet_support == 0)
|
if (phba->nvmet_support == 0)
|
||||||
@ -763,6 +768,7 @@ lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba)
|
|||||||
wait_for_completion_timeout(&tgtp->tport_unreg_done, 5);
|
wait_for_completion_timeout(&tgtp->tport_unreg_done, 5);
|
||||||
}
|
}
|
||||||
phba->targetport = NULL;
|
phba->targetport = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -782,6 +788,7 @@ static void
|
|||||||
lpfc_nvmet_unsol_ls_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
lpfc_nvmet_unsol_ls_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||||
struct hbq_dmabuf *nvmebuf)
|
struct hbq_dmabuf *nvmebuf)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_TARGET
|
||||||
struct lpfc_nvmet_tgtport *tgtp;
|
struct lpfc_nvmet_tgtport *tgtp;
|
||||||
struct fc_frame_header *fc_hdr;
|
struct fc_frame_header *fc_hdr;
|
||||||
struct lpfc_nvmet_rcv_ctx *ctxp;
|
struct lpfc_nvmet_rcv_ctx *ctxp;
|
||||||
@ -862,6 +869,7 @@ dropit:
|
|||||||
|
|
||||||
atomic_inc(&tgtp->xmt_ls_abort);
|
atomic_inc(&tgtp->xmt_ls_abort);
|
||||||
lpfc_nvmet_unsol_ls_issue_abort(phba, ctxp, sid, oxid);
|
lpfc_nvmet_unsol_ls_issue_abort(phba, ctxp, sid, oxid);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -883,6 +891,7 @@ lpfc_nvmet_unsol_fcp_buffer(struct lpfc_hba *phba,
|
|||||||
struct rqb_dmabuf *nvmebuf,
|
struct rqb_dmabuf *nvmebuf,
|
||||||
uint64_t isr_timestamp)
|
uint64_t isr_timestamp)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LPFC_NVME_TARGET
|
||||||
struct lpfc_nvmet_rcv_ctx *ctxp;
|
struct lpfc_nvmet_rcv_ctx *ctxp;
|
||||||
struct lpfc_nvmet_tgtport *tgtp;
|
struct lpfc_nvmet_tgtport *tgtp;
|
||||||
struct fc_frame_header *fc_hdr;
|
struct fc_frame_header *fc_hdr;
|
||||||
@ -988,6 +997,7 @@ dropit:
|
|||||||
/* We assume a rcv'ed cmd ALWAYs fits into 1 buffer */
|
/* We assume a rcv'ed cmd ALWAYs fits into 1 buffer */
|
||||||
lpfc_nvmet_rq_post(phba, NULL, &nvmebuf->hbuf);
|
lpfc_nvmet_rq_post(phba, NULL, &nvmebuf->hbuf);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user