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.

Dependency Surface

Detected Declarations

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

Implementation Notes