drivers/scsi/lpfc/lpfc_nportdisc.c
Source file repositories/reference/linux-study-clean/drivers/scsi/lpfc/lpfc_nportdisc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/scsi/lpfc/lpfc_nportdisc.c- Extension
.c- Size
- 95428 bytes
- Lines
- 3134
- Domain
- Driver Families
- Bucket
- drivers/scsi
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/blkdev.hlinux/pci.hlinux/slab.hlinux/interrupt.hscsi/scsi.hscsi/scsi_device.hscsi/scsi_host.hscsi/scsi_transport_fc.hscsi/fc/fc_fs.hlpfc_hw4.hlpfc_hw.hlpfc_sli.hlpfc_sli4.hlpfc_nl.hlpfc_disc.hlpfc.hlpfc_scsi.hlpfc_nvme.hlpfc_logmsg.hlpfc_crtn.hlpfc_vport.hlpfc_debugfs.h
Detected Declarations
function lpfc_check_unload_and_clr_rscnfunction lpfc_check_adiscfunction lpfc_check_sparmfunction lpfc_check_elscmpl_iocbfunction lpfc_els_abortfunction list_for_each_entry_safefunction lpfc_defer_plogi_accfunction lpfc_rcv_plogifunction test_bitfunction lpfc_mbx_cmpl_resume_rpifunction lpfc_rcv_padiscfunction lpfc_rcv_logofunction lpfc_rcv_prli_support_checkfunction lpfc_rcv_prlifunction lpfc_disc_set_adiscfunction lpfc_release_rpifunction lpfc_disc_illegalfunction lpfc_cmpl_plogi_illegalfunction lpfc_rcv_plogi_unused_nodefunction lpfc_rcv_els_unused_nodefunction lpfc_rcv_logo_unused_nodefunction lpfc_cmpl_logo_unused_nodefunction lpfc_device_rm_unused_nodefunction lpfc_device_recov_unused_nodefunction lpfc_rcv_plogi_plogi_issuefunction lpfc_rcv_prli_plogi_issuefunction lpfc_rcv_logo_plogi_issuefunction lpfc_rcv_els_plogi_issuefunction lpfc_cmpl_plogi_plogi_issuefunction wwn_to_u64function lpfc_cmpl_logo_plogi_issuefunction lpfc_cmpl_reglogin_plogi_issuefunction lpfc_device_rm_plogi_issuefunction lpfc_device_recov_plogi_issuefunction lpfc_rcv_plogi_adisc_issuefunction lpfc_rcv_prli_adisc_issuefunction lpfc_rcv_logo_adisc_issuefunction lpfc_rcv_padisc_adisc_issuefunction lpfc_rcv_prlo_adisc_issuefunction lpfc_cmpl_adisc_adisc_issuefunction lpfc_device_rm_adisc_issuefunction lpfc_device_recov_adisc_issuefunction lpfc_rcv_plogi_reglogin_issuefunction lpfc_rcv_prli_reglogin_issuefunction lpfc_rcv_logo_reglogin_issuefunction lpfc_rcv_padisc_reglogin_issuefunction lpfc_rcv_prlo_reglogin_issuefunction lpfc_cmpl_reglogin_reglogin_issue
Annotated Snippet
if (!flogi) {
hsp_value = ((hsp->cls1.rcvDataSizeMsb << 8) |
hsp->cls1.rcvDataSizeLsb);
ssp_value = ((sp->cls1.rcvDataSizeMsb << 8) |
sp->cls1.rcvDataSizeLsb);
if (!ssp_value)
goto bad_service_param;
if (ssp_value > hsp_value) {
sp->cls1.rcvDataSizeLsb =
hsp->cls1.rcvDataSizeLsb;
sp->cls1.rcvDataSizeMsb =
hsp->cls1.rcvDataSizeMsb;
}
}
} else if (class == CLASS1)
goto bad_service_param;
if (sp->cls2.classValid) {
if (!flogi) {
hsp_value = ((hsp->cls2.rcvDataSizeMsb << 8) |
hsp->cls2.rcvDataSizeLsb);
ssp_value = ((sp->cls2.rcvDataSizeMsb << 8) |
sp->cls2.rcvDataSizeLsb);
if (!ssp_value)
goto bad_service_param;
if (ssp_value > hsp_value) {
sp->cls2.rcvDataSizeLsb =
hsp->cls2.rcvDataSizeLsb;
sp->cls2.rcvDataSizeMsb =
hsp->cls2.rcvDataSizeMsb;
}
}
} else if (class == CLASS2)
goto bad_service_param;
if (sp->cls3.classValid) {
if (!flogi) {
hsp_value = ((hsp->cls3.rcvDataSizeMsb << 8) |
hsp->cls3.rcvDataSizeLsb);
ssp_value = ((sp->cls3.rcvDataSizeMsb << 8) |
sp->cls3.rcvDataSizeLsb);
if (!ssp_value)
goto bad_service_param;
if (ssp_value > hsp_value) {
sp->cls3.rcvDataSizeLsb =
hsp->cls3.rcvDataSizeLsb;
sp->cls3.rcvDataSizeMsb =
hsp->cls3.rcvDataSizeMsb;
}
}
} else if (class == CLASS3)
goto bad_service_param;
/*
* Preserve the upper four bits of the MSB from the PLOGI response.
* These bits contain the Buffer-to-Buffer State Change Number
* from the target and need to be passed to the FW.
*/
hsp_value = (hsp->cmn.bbRcvSizeMsb << 8) | hsp->cmn.bbRcvSizeLsb;
ssp_value = (sp->cmn.bbRcvSizeMsb << 8) | sp->cmn.bbRcvSizeLsb;
if (ssp_value > hsp_value) {
sp->cmn.bbRcvSizeLsb = hsp->cmn.bbRcvSizeLsb;
sp->cmn.bbRcvSizeMsb = (sp->cmn.bbRcvSizeMsb & 0xF0) |
(hsp->cmn.bbRcvSizeMsb & 0x0F);
}
memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name));
memcpy(&ndlp->nlp_portname, &sp->portName, sizeof (struct lpfc_name));
return 1;
bad_service_param:
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
"0207 Device %x "
"(%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x) sent "
"invalid service parameters. Ignoring device.\n",
ndlp->nlp_DID,
sp->nodeName.u.wwn[0], sp->nodeName.u.wwn[1],
sp->nodeName.u.wwn[2], sp->nodeName.u.wwn[3],
sp->nodeName.u.wwn[4], sp->nodeName.u.wwn[5],
sp->nodeName.u.wwn[6], sp->nodeName.u.wwn[7]);
return 0;
}
static void *
lpfc_check_elscmpl_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
struct lpfc_iocbq *rspiocb)
{
struct lpfc_dmabuf *pcmd, *prsp;
uint32_t *lp;
void *ptr = NULL;
u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
pcmd = cmdiocb->cmd_dmabuf;
Annotation
- Immediate include surface: `linux/blkdev.h`, `linux/pci.h`, `linux/slab.h`, `linux/interrupt.h`, `scsi/scsi.h`, `scsi/scsi_device.h`, `scsi/scsi_host.h`, `scsi/scsi_transport_fc.h`.
- Detected declarations: `function lpfc_check_unload_and_clr_rscn`, `function lpfc_check_adisc`, `function lpfc_check_sparm`, `function lpfc_check_elscmpl_iocb`, `function lpfc_els_abort`, `function list_for_each_entry_safe`, `function lpfc_defer_plogi_acc`, `function lpfc_rcv_plogi`, `function test_bit`, `function lpfc_mbx_cmpl_resume_rpi`.
- Atlas domain: Driver Families / drivers/scsi.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.