drivers/scsi/fnic/fdls_disc.c
Source file repositories/reference/linux-study-clean/drivers/scsi/fnic/fdls_disc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/scsi/fnic/fdls_disc.c- Extension
.c- Size
- 162300 bytes
- Lines
- 5094
- 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/workqueue.hfnic.hfdls_fc.hfnic_fdls.hscsi/fc/fc_fcp.hscsi/scsi_transport_fc.hlinux/utsname.h
Detected Declarations
function fdls_alloc_oxidfunction fdls_free_oxid_idxfunction oxidfunction fdls_free_oxidfunction fdls_schedule_oxid_freefunction fdls_schedule_oxid_free_retry_workfunction for_each_set_bitfunction fdls_is_oxid_fabric_reqfunction fdls_is_oxid_fdmi_reqfunction fdls_is_oxid_tgt_reqfunction fdls_reset_oxid_poolfunction fnic_del_fabric_timer_syncfunction fnic_del_tport_timer_syncfunction fdls_start_fabric_timerfunction fdls_start_tport_timerfunction fdls_init_plogi_framefunction fdls_init_els_acc_framefunction fdls_init_els_rjt_framefunction fdls_init_logo_framefunction fdls_init_fabric_abts_framefunction fdls_send_rscn_respfunction fdls_send_logo_respfunction fdls_send_tport_abtsfunction fdls_send_fabric_abtsfunction fdls_send_fdmi_abtsfunction fdls_send_fabric_flogifunction fdls_send_fabric_plogifunction fdls_send_fdmi_plogifunction fdls_send_rpn_idfunction fdls_send_scrfunction fdls_send_gpn_ftfunction fdls_send_tgt_adiscfunction fdls_delete_tportfunction fdls_send_tgt_plogifunction fnic_fc_plogi_rsp_rdffunction fdls_send_register_fc4_typesfunction fdls_send_register_fc4_featuresfunction fdls_send_tgt_prlifunction fdls_send_fabric_logofunction fdls_tgt_logoutfunction fdls_tgt_discovery_startfunction list_for_each_entry_safefunction fdls_target_restart_nexusfunction list_for_each_entry_safefunction list_for_each_entry_safefunction fnic_fdmi_attr_setfunction fdls_fdmi_register_hbafunction fdls_fdmi_register_pa
Annotated Snippet
if (!reclaim_entry) {
schedule_delayed_work(&oxid_pool->schedule_oxid_free_retry,
msecs_to_jiffies(SCHEDULE_OXID_FREE_RETRY_TIME));
return;
}
clear_bit(idx, oxid_pool->pending_schedule_free);
reclaim_entry->oxid_idx = idx;
reclaim_entry->expires = round_jiffies(jiffies + delay_j);
spin_lock_irqsave(&fnic->fnic_lock, flags);
list_add_tail(&reclaim_entry->links, &oxid_pool->oxid_reclaim_list);
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
schedule_delayed_work(&oxid_pool->oxid_reclaim_work, delay_j);
}
}
static bool fdls_is_oxid_fabric_req(uint16_t oxid)
{
int oxid_frame_type = FNIC_FRAME_TYPE(oxid);
switch (oxid_frame_type) {
case FNIC_FRAME_TYPE_FABRIC_FLOGI:
case FNIC_FRAME_TYPE_FABRIC_PLOGI:
case FNIC_FRAME_TYPE_FABRIC_RPN:
case FNIC_FRAME_TYPE_FABRIC_RFT:
case FNIC_FRAME_TYPE_FABRIC_RFF:
case FNIC_FRAME_TYPE_FABRIC_GPN_FT:
case FNIC_FRAME_TYPE_FABRIC_LOGO:
break;
default:
return false;
}
return true;
}
static bool fdls_is_oxid_fdmi_req(uint16_t oxid)
{
int oxid_frame_type = FNIC_FRAME_TYPE(oxid);
switch (oxid_frame_type) {
case FNIC_FRAME_TYPE_FDMI_PLOGI:
case FNIC_FRAME_TYPE_FDMI_RHBA:
case FNIC_FRAME_TYPE_FDMI_RPA:
break;
default:
return false;
}
return true;
}
static bool fdls_is_oxid_tgt_req(uint16_t oxid)
{
int oxid_frame_type = FNIC_FRAME_TYPE(oxid);
switch (oxid_frame_type) {
case FNIC_FRAME_TYPE_TGT_PLOGI:
case FNIC_FRAME_TYPE_TGT_PRLI:
case FNIC_FRAME_TYPE_TGT_ADISC:
case FNIC_FRAME_TYPE_TGT_LOGO:
break;
default:
return false;
}
return true;
}
static void fdls_reset_oxid_pool(struct fnic_iport_s *iport)
{
struct fnic_oxid_pool_s *oxid_pool = &iport->oxid_pool;
oxid_pool->next_idx = 0;
}
void fnic_del_fabric_timer_sync(struct fnic *fnic)
{
fnic->iport.fabric.del_timer_inprogress = 1;
spin_unlock_irqrestore(&fnic->fnic_lock, fnic->lock_flags);
timer_delete_sync(&fnic->iport.fabric.retry_timer);
spin_lock_irqsave(&fnic->fnic_lock, fnic->lock_flags);
fnic->iport.fabric.del_timer_inprogress = 0;
}
void fnic_del_tport_timer_sync(struct fnic *fnic,
struct fnic_tport_s *tport)
{
tport->del_timer_inprogress = 1;
spin_unlock_irqrestore(&fnic->fnic_lock, fnic->lock_flags);
timer_delete_sync(&tport->retry_timer);
spin_lock_irqsave(&fnic->fnic_lock, fnic->lock_flags);
tport->del_timer_inprogress = 0;
Annotation
- Immediate include surface: `linux/workqueue.h`, `fnic.h`, `fdls_fc.h`, `fnic_fdls.h`, `scsi/fc/fc_fcp.h`, `scsi/scsi_transport_fc.h`, `linux/utsname.h`.
- Detected declarations: `function fdls_alloc_oxid`, `function fdls_free_oxid_idx`, `function oxid`, `function fdls_free_oxid`, `function fdls_schedule_oxid_free`, `function fdls_schedule_oxid_free_retry_work`, `function for_each_set_bit`, `function fdls_is_oxid_fabric_req`, `function fdls_is_oxid_fdmi_req`, `function fdls_is_oxid_tgt_req`.
- 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.