drivers/net/ethernet/huawei/hinic3/hinic3_ethtool.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/huawei/hinic3/hinic3_ethtool.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/huawei/hinic3/hinic3_ethtool.c
Extension
.c
Size
12768 bytes
Lines
426
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

struct hw2ethtool_link_mode {
	const u32 *link_mode_bit_arr;
	u32       arr_size;
	u32       speed;
};

static const struct hw2ethtool_link_mode
	hw2ethtool_link_mode_table[LINK_MODE_MAX_NUMBERS] = {
	[LINK_MODE_GE] = {
		.link_mode_bit_arr = hinic3_link_mode_ge,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_ge),
		.speed             = SPEED_1000,
	},
	[LINK_MODE_10GE_BASE_R] = {
		.link_mode_bit_arr = hinic3_link_mode_10ge_base_r,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_10ge_base_r),
		.speed             = SPEED_10000,
	},
	[LINK_MODE_25GE_BASE_R] = {
		.link_mode_bit_arr = hinic3_link_mode_25ge_base_r,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_25ge_base_r),
		.speed             = SPEED_25000,
	},
	[LINK_MODE_40GE_BASE_R4] = {
		.link_mode_bit_arr = hinic3_link_mode_40ge_base_r4,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_40ge_base_r4),
		.speed             = SPEED_40000,
	},
	[LINK_MODE_50GE_BASE_R] = {
		.link_mode_bit_arr = hinic3_link_mode_50ge_base_r,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_50ge_base_r),
		.speed             = SPEED_50000,
	},
	[LINK_MODE_50GE_BASE_R2] = {
		.link_mode_bit_arr = hinic3_link_mode_50ge_base_r2,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_50ge_base_r2),
		.speed             = SPEED_50000,
	},
	[LINK_MODE_100GE_BASE_R] = {
		.link_mode_bit_arr = hinic3_link_mode_100ge_base_r,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_100ge_base_r),
		.speed             = SPEED_100000,
	},
	[LINK_MODE_100GE_BASE_R2] = {
		.link_mode_bit_arr = hinic3_link_mode_100ge_base_r2,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_100ge_base_r2),
		.speed             = SPEED_100000,
	},
	[LINK_MODE_100GE_BASE_R4] = {
		.link_mode_bit_arr = hinic3_link_mode_100ge_base_r4,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_100ge_base_r4),
		.speed             = SPEED_100000,
	},
	[LINK_MODE_200GE_BASE_R2] = {
		.link_mode_bit_arr = hinic3_link_mode_200ge_base_r2,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_200ge_base_r2),
		.speed             = SPEED_200000,
	},
	[LINK_MODE_200GE_BASE_R4] = {
		.link_mode_bit_arr = hinic3_link_mode_200ge_base_r4,
		.arr_size          = ARRAY_SIZE(hinic3_link_mode_200ge_base_r4),
		.speed             = SPEED_200000,
	},
};

#define GET_SUPPORTED_MODE     0
#define GET_ADVERTISED_MODE    1

struct hinic3_link_settings {
	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
	__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);

	u32 speed;
	u8  duplex;
	u8  port;
	u8  autoneg;
};

#define HINIC3_ADD_SUPPORTED_LINK_MODE(ecmd, mode) \
	set_bit(ETHTOOL_LINK_##mode##_BIT, (ecmd)->supported)
#define HINIC3_ADD_ADVERTISED_LINK_MODE(ecmd, mode) \
	set_bit(ETHTOOL_LINK_##mode##_BIT, (ecmd)->advertising)

static void hinic3_add_speed_link_mode(unsigned long *bitmap, u32 mode)
{
	u32 i;

	for (i = 0; i < hw2ethtool_link_mode_table[mode].arr_size; i++) {
		if (hw2ethtool_link_mode_table[mode].link_mode_bit_arr[i] >=
		    __ETHTOOL_LINK_MODE_MASK_NBITS)

Annotation

Implementation Notes