drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c
Source file repositories/reference/linux-study-clean/drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c- Extension
.c- Size
- 15612 bytes
- Lines
- 584
- Domain
- Driver Families
- Bucket
- drivers/net
- 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.
- 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/device.hlinux/gfp.hlinux/irqreturn.hlinux/kernel.hlinux/list.hlinux/string.hlinux/wait.hlinux/workqueue.ht7xx_dpmaif.ht7xx_hif_dpmaif.ht7xx_hif_dpmaif_rx.ht7xx_hif_dpmaif_tx.ht7xx_pci.ht7xx_pcie_mac.ht7xx_state_monitor.h
Detected Declarations
function Copyrightfunction t7xx_ring_buf_rd_wr_countfunction t7xx_dpmaif_enable_irqfunction t7xx_dpmaif_disable_irqfunction t7xx_dpmaif_irq_cbfunction t7xx_dpmaif_isr_handlerfunction t7xx_dpmaif_isr_threadfunction t7xx_dpmaif_isr_parameter_initfunction t7xx_dpmaif_register_pcie_irqfunction t7xx_dpmaif_rxtx_sw_allocsfunction t7xx_dpmaif_sw_releasefunction t7xx_dpmaif_startfunction t7xx_dpmaif_stop_swfunction t7xx_dpmaif_stop_hwfunction t7xx_dpmaif_stopfunction t7xx_dpmaif_suspendfunction t7xx_dpmaif_unmask_dlq_intrfunction t7xx_dpmaif_start_txrx_qsfunction t7xx_dpmaif_resumefunction t7xx_dpmaif_pm_entity_initfunction t7xx_dpmaif_pm_entity_releasefunction t7xx_dpmaif_md_state_callbackfunction t7xx_dpmaif_hif_initfunction t7xx_dpmaif_hif_exit
Annotated Snippet
switch (intr_status.intr_types[i]) {
case DPF_INTR_UL_DONE:
t7xx_dpmaif_irq_tx_done(dpmaif_ctrl, intr_status.intr_queues[i]);
break;
case DPF_INTR_UL_DRB_EMPTY:
case DPF_INTR_UL_MD_NOTREADY:
case DPF_INTR_UL_MD_PWR_NOTREADY:
/* No need to log an error for these */
break;
case DPF_INTR_DL_BATCNT_LEN_ERR:
dev_err_ratelimited(dev, "DL interrupt: packet BAT count length error\n");
t7xx_dpmaif_dl_unmask_batcnt_len_err_intr(hw_info);
break;
case DPF_INTR_DL_PITCNT_LEN_ERR:
dev_err_ratelimited(dev, "DL interrupt: PIT count length error\n");
t7xx_dpmaif_dl_unmask_pitcnt_len_err_intr(hw_info);
break;
case DPF_INTR_DL_Q0_PITCNT_LEN_ERR:
dev_err_ratelimited(dev, "DL interrupt: DLQ0 PIT count length error\n");
t7xx_dpmaif_dlq_unmask_pitcnt_len_err_intr(hw_info, DPF_RX_QNO_DFT);
break;
case DPF_INTR_DL_Q1_PITCNT_LEN_ERR:
dev_err_ratelimited(dev, "DL interrupt: DLQ1 PIT count length error\n");
t7xx_dpmaif_dlq_unmask_pitcnt_len_err_intr(hw_info, DPF_RX_QNO1);
break;
case DPF_INTR_DL_DONE:
case DPF_INTR_DL_Q0_DONE:
case DPF_INTR_DL_Q1_DONE:
t7xx_dpmaif_irq_rx_done(dpmaif_ctrl, intr_status.intr_queues[i]);
break;
default:
dev_err_ratelimited(dev, "DL interrupt error: unknown type : %d\n",
intr_status.intr_types[i]);
}
}
}
static irqreturn_t t7xx_dpmaif_isr_handler(int irq, void *data)
{
struct dpmaif_isr_para *isr_para = data;
struct dpmaif_ctrl *dpmaif_ctrl;
dpmaif_ctrl = isr_para->dpmaif_ctrl;
if (dpmaif_ctrl->state != DPMAIF_STATE_PWRON) {
dev_err(dpmaif_ctrl->dev, "Interrupt received before initializing DPMAIF\n");
return IRQ_HANDLED;
}
t7xx_pcie_mac_clear_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int);
return IRQ_WAKE_THREAD;
}
static irqreturn_t t7xx_dpmaif_isr_thread(int irq, void *data)
{
struct dpmaif_isr_para *isr_para = data;
struct dpmaif_ctrl *dpmaif_ctrl = isr_para->dpmaif_ctrl;
t7xx_dpmaif_irq_cb(isr_para);
t7xx_pcie_mac_set_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int);
return IRQ_HANDLED;
}
static void t7xx_dpmaif_isr_parameter_init(struct dpmaif_ctrl *dpmaif_ctrl)
{
struct dpmaif_isr_para *isr_para;
unsigned char i;
dpmaif_ctrl->rxq_int_mapping[DPF_RX_QNO0] = DPMAIF_INT;
dpmaif_ctrl->rxq_int_mapping[DPF_RX_QNO1] = DPMAIF2_INT;
for (i = 0; i < DPMAIF_RXQ_NUM; i++) {
isr_para = &dpmaif_ctrl->isr_para[i];
isr_para->dpmaif_ctrl = dpmaif_ctrl;
isr_para->dlq_id = i;
isr_para->pcie_int = dpmaif_ctrl->rxq_int_mapping[i];
}
}
static void t7xx_dpmaif_register_pcie_irq(struct dpmaif_ctrl *dpmaif_ctrl)
{
struct t7xx_pci_dev *t7xx_dev = dpmaif_ctrl->t7xx_dev;
struct dpmaif_isr_para *isr_para;
Annotation
- Immediate include surface: `linux/device.h`, `linux/gfp.h`, `linux/irqreturn.h`, `linux/kernel.h`, `linux/list.h`, `linux/string.h`, `linux/wait.h`, `linux/workqueue.h`.
- Detected declarations: `function Copyright`, `function t7xx_ring_buf_rd_wr_count`, `function t7xx_dpmaif_enable_irq`, `function t7xx_dpmaif_disable_irq`, `function t7xx_dpmaif_irq_cb`, `function t7xx_dpmaif_isr_handler`, `function t7xx_dpmaif_isr_thread`, `function t7xx_dpmaif_isr_parameter_init`, `function t7xx_dpmaif_register_pcie_irq`, `function t7xx_dpmaif_rxtx_sw_allocs`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- 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.