drivers/net/ethernet/alibaba/eea/eea_tx.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/alibaba/eea/eea_tx.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/alibaba/eea/eea_tx.c- Extension
.c- Size
- 10849 bytes
- Lines
- 501
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
net/netdev_queues.heea_net.heea_pci.heea_ring.h
Detected Declarations
struct eea_sq_free_statsstruct eea_tx_metafunction eea_tx_meta_put_and_unmapfunction eea_meta_free_xmitfunction eea_clean_txfunction eea_poll_txfunction eea_fill_desc_from_skbfunction eea_tx_add_skb_fragfunction eea_tx_post_skbfunction eea_tx_kickfunction eea_tx_check_free_numfunction eea_tx_xmitfunction eea_free_metafunction eea_free_txfunction eea_alloc_tx
Annotated Snippet
struct eea_sq_free_stats {
u64 packets;
u64 bytes;
};
struct eea_tx_meta {
struct eea_tx_meta *next;
u32 id;
union {
struct sk_buff *skb;
void *data;
};
u32 num;
dma_addr_t dma_addr;
struct eea_tx_desc *desc;
u32 dma_len;
bool unmap;
bool unmap_single;
};
static struct eea_tx_meta *eea_tx_meta_get(struct eea_net_tx *tx)
{
struct eea_tx_meta *meta;
if (!tx->free)
return NULL;
meta = tx->free;
tx->free = meta->next;
return meta;
}
static void eea_tx_meta_put_and_unmap(struct eea_net_tx *tx,
struct eea_tx_meta *meta)
{
struct eea_tx_meta *head;
head = meta;
while (true) {
if (meta->unmap) {
if (meta->unmap_single)
dma_unmap_single(tx->dma_dev, meta->dma_addr,
meta->dma_len, DMA_TO_DEVICE);
else
dma_unmap_page(tx->dma_dev, meta->dma_addr,
meta->dma_len, DMA_TO_DEVICE);
}
if (meta->next) {
meta = meta->next;
continue;
}
break;
}
meta->next = tx->free;
tx->free = head;
}
static void eea_meta_free_xmit(struct eea_net_tx *tx,
struct eea_tx_meta *meta,
int budget,
struct eea_tx_cdesc *desc,
struct eea_sq_free_stats *stats)
{
struct sk_buff *skb = meta->skb;
if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && desc)) {
struct skb_shared_hwtstamps ts = {};
ts.hwtstamp = EEA_DESC_TS(desc) + tx->enet->hw_ts_offset;
skb_tstamp_tx(skb, &ts);
}
++stats->packets;
stats->bytes += meta->skb->len;
napi_consume_skb(meta->skb, budget);
meta->data = NULL;
}
static int eea_clean_tx(struct eea_net_tx *tx, int budget)
{
Annotation
- Immediate include surface: `net/netdev_queues.h`, `eea_net.h`, `eea_pci.h`, `eea_ring.h`.
- Detected declarations: `struct eea_sq_free_stats`, `struct eea_tx_meta`, `function eea_tx_meta_put_and_unmap`, `function eea_meta_free_xmit`, `function eea_clean_tx`, `function eea_poll_tx`, `function eea_fill_desc_from_skb`, `function eea_tx_add_skb_frag`, `function eea_tx_post_skb`, `function eea_tx_kick`.
- 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.