drivers/infiniband/hw/irdma/hw.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/irdma/hw.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/irdma/hw.c- Extension
.c- Size
- 80187 bytes
- Lines
- 2907
- Domain
- Driver Families
- Bucket
- drivers/infiniband
- 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
main.h
Detected Declarations
function irdma_iwarp_ce_handlerfunction irdma_puda_ce_handlerfunction irdma_process_normal_ceqefunction irdma_process_reserved_ceqefunction scoped_guardfunction irdma_process_ceqfunction irdma_set_flush_fieldsfunction irdma_complete_cqp_requestfunction irdma_process_ae_def_cmplfunction irdma_process_aeqfunction irdma_ena_intrfunction irdma_dpcfunction irdma_ceq_dpcfunction irdma_save_msix_infofunction irdma_irq_handlerfunction irdma_ceq_handlerfunction irdma_destroy_irqfunction irdma_destroy_cqpfunction irdma_destroy_virt_aeqfunction irdma_destroy_aeqfunction irdma_destroy_ceqfunction irdma_del_ceq_0function irdma_del_ceqsfunction irdma_destroy_ccqfunction irdma_close_hmc_objects_typefunction irdma_del_hmc_objectsfunction irdma_create_hmc_obj_typefunction irdma_create_hmc_objsfunction irdma_obj_aligned_memfunction irdma_create_cqpfunction irdma_create_ccqfunction irdma_alloc_set_macfunction irdma_cfg_ceq_vectorfunction irdma_cfg_aeq_vectorfunction irdma_create_ceqfunction irdma_setup_ceq_0function irdma_setup_ceqsfunction irdma_create_virt_aeqfunction irdma_create_aeqfunction irdma_setup_aeqfunction irdma_initialize_ilqfunction irdma_initialize_ieqfunction irdma_reinitialize_ieqfunction irdma_hmc_setupfunction irdma_del_init_memfunction irdma_initialize_devfunction irdma_rt_deinit_hwfunction irdma_setup_init_state
Annotated Snippet
if (status) {
ibdev_dbg(to_ibdev(dev), "ERR: puda status = %d\n", status);
break;
}
if (compl_error) {
ibdev_dbg(to_ibdev(dev), "ERR: puda compl_err =0x%x\n",
compl_error);
break;
}
} while (1);
irdma_sc_ccq_arm(cq);
}
/**
* irdma_process_normal_ceqe - Handle a CEQE for a normal CQ.
* @rf: RDMA PCI function.
* @dev: iWARP device.
* @cq_idx: CQ ID. Must be in table bounds.
*
* Context: Atomic (CEQ lock must be held)
*/
static void irdma_process_normal_ceqe(struct irdma_pci_f *rf,
struct irdma_sc_dev *dev, u32 cq_idx)
{
/* cq_idx bounds validated in irdma_sc_process_ceq. */
struct irdma_cq *icq = READ_ONCE(rf->cq_table[cq_idx]);
struct irdma_sc_cq *cq;
if (unlikely(!icq)) {
/* Should not happen since CEQ is scrubbed upon CQ delete. */
ibdev_warn_ratelimited(to_ibdev(dev), "Stale CEQE for CQ %u",
cq_idx);
return;
}
cq = &icq->sc_cq;
if (unlikely(cq->cq_type != IRDMA_CQ_TYPE_IWARP)) {
ibdev_warn_ratelimited(to_ibdev(dev), "Unexpected CQ type %u",
cq->cq_type);
return;
}
writel(cq->cq_uk.cq_id, cq->cq_uk.cq_ack_db);
irdma_iwarp_ce_handler(cq);
}
/**
* irdma_process_reserved_ceqe - Handle a CEQE for a reserved CQ.
* @rf: RDMA PCI function.
* @dev: iWARP device.
* @cq_idx: CQ ID.
*
* Context: Atomic
*/
static void irdma_process_reserved_ceqe(struct irdma_pci_f *rf,
struct irdma_sc_dev *dev, u32 cq_idx)
{
struct irdma_sc_cq *cq;
if (cq_idx == IRDMA_RSVD_CQ_ID_CQP) {
cq = &rf->ccq.sc_cq;
/* CQP CQ lifetime > CEQ. */
writel(cq->cq_uk.cq_id, cq->cq_uk.cq_ack_db);
queue_work(rf->cqp_cmpl_wq, &rf->cqp_cmpl_work);
} else if (cq_idx == IRDMA_RSVD_CQ_ID_ILQ ||
cq_idx == IRDMA_RSVD_CQ_ID_IEQ) {
scoped_guard(spinlock_irqsave, &dev->puda_cq_lock) {
cq = (cq_idx == IRDMA_RSVD_CQ_ID_ILQ) ?
dev->ilq_cq : dev->ieq_cq;
if (!cq) {
ibdev_warn_ratelimited(to_ibdev(dev),
"Stale ILQ/IEQ CEQE");
return;
}
writel(cq->cq_uk.cq_id, cq->cq_uk.cq_ack_db);
irdma_puda_ce_handler(rf, cq);
}
}
}
/**
* irdma_process_ceq - handle ceq for completions
* @rf: RDMA PCI function
* @ceq: ceq having cq for completion
*/
static void irdma_process_ceq(struct irdma_pci_f *rf, struct irdma_ceq *ceq)
{
struct irdma_sc_dev *dev = &rf->sc_dev;
Annotation
- Immediate include surface: `main.h`.
- Detected declarations: `function irdma_iwarp_ce_handler`, `function irdma_puda_ce_handler`, `function irdma_process_normal_ceqe`, `function irdma_process_reserved_ceqe`, `function scoped_guard`, `function irdma_process_ceq`, `function irdma_set_flush_fields`, `function irdma_complete_cqp_request`, `function irdma_process_ae_def_cmpl`, `function irdma_process_aeq`.
- Atlas domain: Driver Families / drivers/infiniband.
- 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.