drivers/scsi/qla2xxx/qla_nx2.c
Source file repositories/reference/linux-study-clean/drivers/scsi/qla2xxx/qla_nx2.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/scsi/qla2xxx/qla_nx2.c- Extension
.c- Size
- 109520 bytes
- Lines
- 4076
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/vmalloc.hlinux/delay.hqla_def.hqla_gbl.h
Detected Declarations
function qla8044_rd_regfunction qla8044_wr_regfunction qla8044_rd_directfunction qla8044_wr_directfunction qla8044_set_win_basefunction qla8044_rd_reg_indirectfunction qla8044_wr_reg_indirectfunction qla8044_read_write_crb_regfunction qla8044_poll_wait_for_readyfunction qla8044_ipmdio_rd_regfunction qla8044_poll_wait_ipmdio_bus_idlefunction qla8044_ipmdio_wr_regfunction qla8044_rmw_crb_regfunction qla8044_set_qsnt_readyfunction qla8044_clear_qsnt_readyfunction qla8044_lock_recoveryfunction qla8044_idc_lockfunction qla8044_idc_unlockfunction qla8044_flash_lockfunction qla8044_flash_unlockfunction qla8044_flash_lock_recoveryfunction qla8044_read_flash_datafunction qla8044_read_optrom_datafunction qla8044_need_resetfunction qla8044_write_listfunction qla8044_read_write_listfunction qla8044_poll_regfunction qla8044_poll_listfunction qla8044_poll_write_listfunction qla8044_read_modify_writefunction qla8044_pausefunction qla8044_template_endfunction qla8044_process_reset_templatefunction qla8044_process_init_seqfunction qla8044_process_stop_seqfunction qla8044_process_start_seqfunction qla8044_lockless_flash_read_u32function qla8044_ms_mem_write_128bfunction qla8044_copy_bootloaderfunction qla8044_restartfunction qla8044_check_cmd_peg_statusfunction qla8044_start_firmwarefunction qla8044_clear_drv_activefunction qla8044_device_bootstrapfunction qla8044_dump_reset_seq_hdrfunction qla8044_reset_seq_checksum_testfunction qla8044_read_reset_templatefunction qla8044_set_idc_dontreset
Annotated Snippet
if (time_after_eq(jiffies, timeout)) {
ql_log(ql_log_warn, vha, 0xb151,
"Error in processing rdmdio entry\n");
return -1;
}
} while (1);
return 0;
}
static uint32_t
qla8044_ipmdio_rd_reg(struct scsi_qla_host *vha,
uint32_t addr1, uint32_t addr3, uint32_t mask, uint32_t addr)
{
uint32_t temp;
int ret = 0;
ret = qla8044_poll_wait_for_ready(vha, addr1, mask);
if (ret == -1)
return -1;
temp = (0x40000000 | addr);
qla8044_wr_reg_indirect(vha, addr1, temp);
ret = qla8044_poll_wait_for_ready(vha, addr1, mask);
if (ret == -1)
return 0;
qla8044_rd_reg_indirect(vha, addr3, &ret);
return ret;
}
static int
qla8044_poll_wait_ipmdio_bus_idle(struct scsi_qla_host *vha,
uint32_t addr1, uint32_t addr2, uint32_t addr3, uint32_t mask)
{
unsigned long timeout;
uint32_t temp;
/* jiffies after 100 msecs */
timeout = jiffies + msecs_to_jiffies(TIMEOUT_100_MS);
do {
temp = qla8044_ipmdio_rd_reg(vha, addr1, addr3, mask, addr2);
if ((temp & 0x1) != 1)
break;
if (time_after_eq(jiffies, timeout)) {
ql_log(ql_log_warn, vha, 0xb152,
"Error in processing mdiobus idle\n");
return -1;
}
} while (1);
return 0;
}
static int
qla8044_ipmdio_wr_reg(struct scsi_qla_host *vha, uint32_t addr1,
uint32_t addr3, uint32_t mask, uint32_t addr, uint32_t value)
{
int ret = 0;
ret = qla8044_poll_wait_for_ready(vha, addr1, mask);
if (ret == -1)
return -1;
qla8044_wr_reg_indirect(vha, addr3, value);
qla8044_wr_reg_indirect(vha, addr1, addr);
ret = qla8044_poll_wait_for_ready(vha, addr1, mask);
if (ret == -1)
return -1;
return 0;
}
/*
* qla8044_rmw_crb_reg - Read value from raddr, AND with test_mask,
* Shift Left,Right/OR/XOR with values RMW header and write value to waddr.
*
* @vha : Pointer to adapter structure
* @raddr : CRB address to read from
* @waddr : CRB address to write to
* @p_rmw_hdr : header with shift/or/xor values.
*
*/
static void
qla8044_rmw_crb_reg(struct scsi_qla_host *vha,
uint32_t raddr, uint32_t waddr, struct qla8044_rmw *p_rmw_hdr)
{
Annotation
- Immediate include surface: `linux/vmalloc.h`, `linux/delay.h`, `qla_def.h`, `qla_gbl.h`.
- Detected declarations: `function qla8044_rd_reg`, `function qla8044_wr_reg`, `function qla8044_rd_direct`, `function qla8044_wr_direct`, `function qla8044_set_win_base`, `function qla8044_rd_reg_indirect`, `function qla8044_wr_reg_indirect`, `function qla8044_read_write_crb_reg`, `function qla8044_poll_wait_for_ready`, `function qla8044_ipmdio_rd_reg`.
- 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.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.