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.
- 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/kernel.hlinux/pci.hlinux/device.hlinux/module.hlinux/types.hlinux/errno.hlinux/etherdevice.hlinux/netdevice.hlinux/ethtool.hhinic3_lld.hhinic3_hw_comm.hhinic3_nic_dev.hhinic3_nic_cfg.h
Detected Declarations
struct hw2ethtool_link_modestruct hinic3_link_settingsfunction hinic3_get_drvinfofunction hinic3_get_msglevelfunction hinic3_set_msglevelfunction hinic3_add_speed_link_modefunction hinic3_add_ethtool_link_modefunction hinic3_link_speed_setfunction hinic3_link_port_type_setfunction hinic3_get_link_pause_settingsfunction hinic3_get_link_settingsfunction hinic3_get_link_ksettingsfunction hinic3_set_ethtool_ops
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
- Immediate include surface: `linux/kernel.h`, `linux/pci.h`, `linux/device.h`, `linux/module.h`, `linux/types.h`, `linux/errno.h`, `linux/etherdevice.h`, `linux/netdevice.h`.
- Detected declarations: `struct hw2ethtool_link_mode`, `struct hinic3_link_settings`, `function hinic3_get_drvinfo`, `function hinic3_get_msglevel`, `function hinic3_set_msglevel`, `function hinic3_add_speed_link_mode`, `function hinic3_add_ethtool_link_mode`, `function hinic3_link_speed_set`, `function hinic3_link_port_type_set`, `function hinic3_get_link_pause_settings`.
- 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.