drivers/net/dsa/mv88e6xxx/tcam.c
Source file repositories/reference/linux-study-clean/drivers/net/dsa/mv88e6xxx/tcam.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/dsa/mv88e6xxx/tcam.c- Extension
.c- Size
- 8318 bytes
- Lines
- 339
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/list.hchip.htcam.h
Detected Declarations
function Copyrightfunction mv88e6xxx_tcam_waitfunction mv88e6xxx_tcam_read_pagefunction mv88e6xxx_tcam_load_pagefunction mv88e6xxx_tcam_flush_entryfunction mv88e6xxx_tcam_flush_allfunction mv88e6xxx_tcam_entry_findfunction mv88e6xxx_tcam_insert_entryfunction list_for_each_prevfunction mv88e6xxx_tcam_entry_addfunction mv88e6xxx_tcam_entry_delfunction mv88e6390_tcam_entry_addfunction mv88e6393_tcam_entry_add
Annotated Snippet
if (entry->key.frame_mask[i]) {
val = entry->key.frame_mask[i] << 8 |
entry->key.frame_data[i];
err = mv88e6xxx_tcam_write(chip,
i - PAGE0_MATCH_SIZE + 2,
val);
if (err)
return err;
}
}
err = mv88e6xxx_tcam_load_page(chip, 1, idx);
if (err)
return err;
err = mv88e6xxx_tcam_read_page(chip, 0, idx);
if (err)
return err;
for (i = 0; i < PAGE0_MATCH_SIZE; i++) {
if (entry->key.frame_mask[i]) {
val = entry->key.frame_mask[i] << 8 |
entry->key.frame_data[i];
err = mv88e6xxx_tcam_write(chip, i + 6, val);
if (err)
return err;
}
}
spv_mask = entry->key.spv_mask & mv88e6xxx_port_mask(chip);
spv = entry->key.spv & mv88e6xxx_port_mask(chip);
/* frame type mask bits must be set for a valid entry */
val = MV88E6XXX_TCAM_KEYS1_FT_MASK |
(spv_mask & MV88E6XXX_TCAM_KEYS1_SPV_MASK_MASK) |
((spv >> 8) & MV88E6XXX_TCAM_KEYS1_SPV_MASK);
err = mv88e6xxx_tcam_write(chip, MV88E6XXX_TCAM_KEYS1, val);
if (err)
return err;
val = ((spv_mask << 8) & MV88E6XXX_TCAM_KEYS2_SPV_MASK_MASK) |
(spv & MV88E6XXX_TCAM_KEYS2_SPV_MASK);
err = mv88e6xxx_tcam_write(chip, MV88E6XXX_TCAM_KEYS2, val);
if (err)
return err;
err = mv88e6xxx_tcam_load_page(chip, 0, idx);
if (err)
return err;
entry->hw_idx = idx;
return 0;
}
static int mv88e6393_tcam_entry_add(struct mv88e6xxx_chip *chip,
struct mv88e6xxx_tcam_entry *entry, u8 idx)
{
int err;
/* select block 0 port 0, then adding an entry is the same as 6390 as
* other blocks aren't used at the moment
*/
err = mv88e6xxx_tcam_write(chip, MV88E6XXX_TCAM_EXTENSION, 0x00);
if (err)
return err;
return mv88e6390_tcam_entry_add(chip, entry, idx);
}
const struct mv88e6xxx_tcam_ops mv88e6390_tcam_ops = {
.entry_add = mv88e6390_tcam_entry_add,
.flush_tcam = mv88e6xxx_tcam_flush_all,
};
const struct mv88e6xxx_tcam_ops mv88e6393_tcam_ops = {
.entry_add = mv88e6393_tcam_entry_add,
.flush_tcam = mv88e6xxx_tcam_flush_all,
};
Annotation
- Immediate include surface: `linux/list.h`, `chip.h`, `tcam.h`.
- Detected declarations: `function Copyright`, `function mv88e6xxx_tcam_wait`, `function mv88e6xxx_tcam_read_page`, `function mv88e6xxx_tcam_load_page`, `function mv88e6xxx_tcam_flush_entry`, `function mv88e6xxx_tcam_flush_all`, `function mv88e6xxx_tcam_entry_find`, `function mv88e6xxx_tcam_insert_entry`, `function list_for_each_prev`, `function mv88e6xxx_tcam_entry_add`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
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.