drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/freescale/enetc/enetc_cbdr.c- Extension
.c- Size
- 7321 bytes
- Lines
- 309
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
enetc.h
Detected Declarations
function enetc_setup_cbdrfunction enetc_teardown_cbdrfunction enetc4_setup_cbdrfunction enetc4_teardown_cbdrfunction enetc_clean_cbdrfunction enetc_cbd_unusedfunction enetc_send_cmdfunction enetc_clear_mac_flt_entryfunction enetc_set_mac_flt_entryfunction enetc_set_fs_entryfunction enetc_cmd_rss_tablefunction enetc_get_rss_tablefunction enetc_set_rss_tablefunction enetc4_get_rss_tablefunction enetc4_set_rss_tableexport enetc_setup_cbdrexport enetc_teardown_cbdrexport enetc4_setup_cbdrexport enetc4_teardown_cbdrexport enetc_send_cmdexport enetc_clear_mac_flt_entryexport enetc_set_mac_flt_entryexport enetc_set_fs_entryexport enetc_get_rss_tableexport enetc_set_rss_tableexport enetc4_get_rss_tableexport enetc4_set_rss_table
Annotated Snippet
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/* Copyright 2017-2019 NXP */
#include "enetc.h"
int enetc_setup_cbdr(struct enetc_si *si)
{
int size = ENETC_CBDR_DEFAULT_SIZE * sizeof(struct enetc_cbd);
struct enetc_cbdr *cbdr = &si->cbd_ring;
struct device *dev = &si->pdev->dev;
struct enetc_hw *hw = &si->hw;
cbdr->bd_base = dma_alloc_coherent(dev, size, &cbdr->bd_dma_base,
GFP_KERNEL);
if (!cbdr->bd_base)
return -ENOMEM;
/* h/w requires 128B alignment */
if (!IS_ALIGNED(cbdr->bd_dma_base, 128)) {
dma_free_coherent(dev, size, cbdr->bd_base,
cbdr->bd_dma_base);
return -EINVAL;
}
cbdr->next_to_clean = 0;
cbdr->next_to_use = 0;
cbdr->dma_dev = dev;
cbdr->bd_count = ENETC_CBDR_DEFAULT_SIZE;
cbdr->pir = hw->reg + ENETC_SICBDRPIR;
cbdr->cir = hw->reg + ENETC_SICBDRCIR;
cbdr->mr = hw->reg + ENETC_SICBDRMR;
/* set CBDR cache attributes */
enetc_wr(hw, ENETC_SICAR2,
ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
enetc_wr(hw, ENETC_SICBDRBAR0, lower_32_bits(cbdr->bd_dma_base));
enetc_wr(hw, ENETC_SICBDRBAR1, upper_32_bits(cbdr->bd_dma_base));
enetc_wr(hw, ENETC_SICBDRLENR, ENETC_RTBLENR_LEN(cbdr->bd_count));
enetc_wr_reg(cbdr->pir, cbdr->next_to_clean);
enetc_wr_reg(cbdr->cir, cbdr->next_to_use);
/* enable ring */
enetc_wr_reg(cbdr->mr, BIT(31));
return 0;
}
EXPORT_SYMBOL_GPL(enetc_setup_cbdr);
void enetc_teardown_cbdr(struct enetc_si *si)
{
struct enetc_cbdr *cbdr = &si->cbd_ring;
int size;
/* disable ring */
enetc_wr_reg(cbdr->mr, 0);
size = cbdr->bd_count * sizeof(struct enetc_cbd);
dma_free_coherent(cbdr->dma_dev, size, cbdr->bd_base,
cbdr->bd_dma_base);
cbdr->bd_base = NULL;
cbdr->dma_dev = NULL;
}
EXPORT_SYMBOL_GPL(enetc_teardown_cbdr);
int enetc4_setup_cbdr(struct enetc_si *si)
{
struct ntmp_user *user = &si->ntmp_user;
struct device *dev = &si->pdev->dev;
struct enetc_hw *hw = &si->hw;
struct netc_cbdr_regs regs;
user->cbdr_num = 1;
user->dev = dev;
user->ring = devm_kcalloc(dev, user->cbdr_num,
sizeof(struct netc_cbdr), GFP_KERNEL);
if (!user->ring)
return -ENOMEM;
regs.pir = hw->reg + ENETC_SICBDRPIR;
regs.cir = hw->reg + ENETC_SICBDRCIR;
regs.mr = hw->reg + ENETC_SICBDRMR;
regs.bar0 = hw->reg + ENETC_SICBDRBAR0;
regs.bar1 = hw->reg + ENETC_SICBDRBAR1;
regs.lenr = hw->reg + ENETC_SICBDRLENR;
return ntmp_init_cbdr(user->ring, dev, ®s);
}
EXPORT_SYMBOL_GPL(enetc4_setup_cbdr);
Annotation
- Immediate include surface: `enetc.h`.
- Detected declarations: `function enetc_setup_cbdr`, `function enetc_teardown_cbdr`, `function enetc4_setup_cbdr`, `function enetc4_teardown_cbdr`, `function enetc_clean_cbdr`, `function enetc_cbd_unused`, `function enetc_send_cmd`, `function enetc_clear_mac_flt_entry`, `function enetc_set_mac_flt_entry`, `function enetc_set_fs_entry`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration 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.