drivers/infiniband/hw/ionic/ionic_admin.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/ionic/ionic_admin.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/ionic/ionic_admin.c- Extension
.c- Size
- 29390 bytes
- Lines
- 1228
- 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
linux/interrupt.hlinux/module.hlinux/printk.hionic_fw.hionic_ibdev.h
Detected Declarations
function ionic_admin_timedoutfunction ionic_admin_reset_dworkfunction ionic_admin_reset_wdogfunction ionic_admin_next_cqefunction ionic_admin_poll_lockedfunction list_for_each_entry_safefunction ionic_admin_dworkfunction ionic_admin_workfunction ionic_admin_post_aqfunction ionic_admin_postfunction ionic_admin_cancelfunction ionic_admin_busy_waitfunction ionic_admin_waitfunction ionic_rdma_devcmdfunction ionic_rdma_reset_devcmdfunction ionic_rdma_queue_devcmdfunction ionic_rdma_admincq_compfunction ionic_rdma_admincq_eventfunction __ionic_destroy_rdma_adminqfunction ionic_flush_qsfunction list_for_each_entry_safefunction list_for_each_entry_safefunction ionic_kill_ibdevfunction ionic_kill_rdma_adminfunction ionic_reset_workfunction ionic_next_eqefunction ionic_cq_eventfunction ionic_qp_eventfunction ionic_poll_eqfunction ionic_poll_eq_workfunction ionic_poll_eq_isrfunction ionic_destroy_eqfunction ionic_create_rdma_adminfunction ionic_destroy_rdma_admin
Annotated Snippet
list_for_each_entry_safe(wr, wr_next, &aq->wr_prod, aq_ent) {
INIT_LIST_HEAD(&wr->aq_ent);
aq->q_wr[wr->status].wr = NULL;
wr->status = atomic_read(&aq->admin_state);
complete_all(&wr->work);
}
INIT_LIST_HEAD(&aq->wr_prod);
list_for_each_entry_safe(wr, wr_next, &aq->wr_post, aq_ent) {
INIT_LIST_HEAD(&wr->aq_ent);
wr->status = atomic_read(&aq->admin_state);
complete_all(&wr->work);
}
INIT_LIST_HEAD(&aq->wr_post);
return;
}
old_prod = cq->q.prod;
while (ionic_admin_next_cqe(dev, cq, &cqe)) {
qtf = ionic_v1_cqe_qtf(cqe);
qid = ionic_v1_cqe_qtf_qid(qtf);
type = ionic_v1_cqe_qtf_type(qtf);
if (unlikely(type != IONIC_V1_CQE_TYPE_ADMIN)) {
ibdev_warn_ratelimited(&dev->ibdev,
"bad cqe type %u\n", type);
goto cq_next;
}
if (unlikely(qid != aq->aqid)) {
ibdev_warn_ratelimited(&dev->ibdev,
"bad cqe qid %u\n", qid);
goto cq_next;
}
if (unlikely(be16_to_cpu(cqe->admin.cmd_idx) != aq->q.cons)) {
ibdev_warn_ratelimited(&dev->ibdev,
"bad idx %u cons %u qid %u\n",
be16_to_cpu(cqe->admin.cmd_idx),
aq->q.cons, qid);
goto cq_next;
}
if (unlikely(ionic_queue_empty(&aq->q))) {
ibdev_warn_ratelimited(&dev->ibdev,
"bad cqe for empty adminq\n");
goto cq_next;
}
wr = aq->q_wr[aq->q.cons].wr;
if (wr) {
aq->q_wr[aq->q.cons].wr = NULL;
list_del_init(&wr->aq_ent);
wr->cqe = *cqe;
wr->status = atomic_read(&aq->admin_state);
complete_all(&wr->work);
}
ionic_queue_consume_entries(&aq->q,
aq->q_wr[aq->q.cons].wqe_strides);
cq_next:
ionic_queue_produce(&cq->q);
cq->color = ionic_color_wrap(cq->q.prod, cq->color);
}
if (old_prod != cq->q.prod) {
ionic_admin_reset_wdog(aq);
cq->q.cons = cq->q.prod;
ionic_dbell_ring(dev->lif_cfg.dbpage, dev->lif_cfg.cq_qtype,
ionic_queue_dbell_val(&cq->q));
queue_work(ionic_evt_workq, &aq->work);
} else if (!aq->armed) {
aq->armed = true;
cq->arm_any_prod = ionic_queue_next(&cq->q, cq->arm_any_prod);
ionic_dbell_ring(dev->lif_cfg.dbpage, dev->lif_cfg.cq_qtype,
cq->q.dbell | IONIC_CQ_RING_ARM |
cq->arm_any_prod);
queue_work(ionic_evt_workq, &aq->work);
}
if (atomic_read(&aq->admin_state) != IONIC_ADMIN_ACTIVE)
return;
old_prod = aq->q.prod;
if (ionic_queue_empty(&aq->q) && !list_empty(&aq->wr_post))
Annotation
- Immediate include surface: `linux/interrupt.h`, `linux/module.h`, `linux/printk.h`, `ionic_fw.h`, `ionic_ibdev.h`.
- Detected declarations: `function ionic_admin_timedout`, `function ionic_admin_reset_dwork`, `function ionic_admin_reset_wdog`, `function ionic_admin_next_cqe`, `function ionic_admin_poll_locked`, `function list_for_each_entry_safe`, `function ionic_admin_dwork`, `function ionic_admin_work`, `function ionic_admin_post_aq`, `function ionic_admin_post`.
- 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.