drivers/net/ethernet/huawei/hinic3/hinic3_filter.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/huawei/hinic3/hinic3_filter.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/huawei/hinic3/hinic3_filter.c- Extension
.c- Size
- 11037 bytes
- Lines
- 418
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/pci.hlinux/device.hlinux/types.hlinux/errno.hlinux/etherdevice.hlinux/netdevice.hlinux/module.hlinux/moduleparam.hhinic3_hwif.hhinic3_nic_dev.hhinic3_nic_cfg.h
Detected Declarations
function hinic3_filter_addr_syncfunction hinic3_filter_addr_unsyncfunction hinic3_clean_mac_list_filterfunction list_for_each_entry_safefunction list_for_each_entry_safefunction hinic3_find_macfunction list_for_each_entryfunction hinic3_add_filterfunction hinic3_del_filterfunction hinic3_mac_filter_entry_clonefunction hinic3_undo_del_filter_entriesfunction list_for_each_entry_safefunction hinic3_undo_add_filter_entriesfunction list_for_each_entry_safefunction hinic3_cleanup_filter_listfunction list_for_each_entry_safefunction hinic3_mac_filter_sync_hwfunction hinic3_mac_filter_syncfunction list_for_each_entry_safefunction list_for_each_entry_safefunction hinic3_mac_filter_sync_allfunction hinic3_update_mac_filterfunction netdev_hw_addr_list_for_eachfunction hinic3_sync_rx_mode_to_hwfunction hinic3_set_rx_mode_work
Annotated Snippet
list_for_each_entry_safe(f, ftmp, del_list, list) {
/* ignore errors when deleting mac */
hinic3_filter_addr_unsync(netdev, f->addr);
list_del(&f->list);
kfree(f);
}
}
if (!list_empty(add_list)) {
list_for_each_entry_safe(f, ftmp, add_list, list) {
if (f->state != HINIC3_MAC_HW_SYNCING)
continue;
err = hinic3_filter_addr_sync(netdev, f->addr);
if (err) {
netdev_err(netdev, "Failed to add mac\n");
return err;
}
f->state = HINIC3_MAC_HW_SYNCED;
(*add_count)++;
}
}
return 0;
}
static int hinic3_mac_filter_sync(struct net_device *netdev,
struct list_head *mac_filter_list, bool uc)
{
struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
struct list_head tmp_del_list, tmp_add_list;
struct hinic3_mac_filter *fclone;
struct hinic3_mac_filter *ftmp;
struct hinic3_mac_filter *f;
int err = 0, add_count = 0;
INIT_LIST_HEAD(&tmp_del_list);
INIT_LIST_HEAD(&tmp_add_list);
list_for_each_entry_safe(f, ftmp, mac_filter_list, list) {
if (f->state != HINIC3_MAC_WAIT_HW_UNSYNC)
continue;
f->state = HINIC3_MAC_HW_UNSYNCED;
list_move_tail(&f->list, &tmp_del_list);
}
list_for_each_entry_safe(f, ftmp, mac_filter_list, list) {
if (f->state != HINIC3_MAC_WAIT_HW_SYNC)
continue;
fclone = hinic3_mac_filter_entry_clone(f);
if (!fclone) {
hinic3_undo_del_filter_entries(mac_filter_list,
&tmp_del_list);
hinic3_undo_add_filter_entries(mac_filter_list,
&tmp_add_list);
netdev_err(netdev,
"Failed to clone mac_filter_entry\n");
err = -ENOMEM;
goto cleanup_tmp_filter_list;
}
f->state = HINIC3_MAC_HW_SYNCING;
list_add_tail(&fclone->list, &tmp_add_list);
}
err = hinic3_mac_filter_sync_hw(netdev, &tmp_del_list,
&tmp_add_list, &add_count);
if (err) {
/* there were errors, delete all mac in hw */
hinic3_undo_add_filter_entries(mac_filter_list, &tmp_add_list);
add_count = 0;
/* VF does not support promiscuous mode,
* don't delete any other uc mac.
*/
if (!HINIC3_IS_VF(nic_dev->hwdev) || !uc) {
list_for_each_entry_safe(f, ftmp, mac_filter_list,
list) {
if (f->state != HINIC3_MAC_HW_SYNCED)
continue;
fclone = hinic3_mac_filter_entry_clone(f);
if (!fclone)
break;
f->state = HINIC3_MAC_WAIT_HW_SYNC;
list_add_tail(&fclone->list, &tmp_del_list);
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/pci.h`, `linux/device.h`, `linux/types.h`, `linux/errno.h`, `linux/etherdevice.h`, `linux/netdevice.h`, `linux/module.h`.
- Detected declarations: `function hinic3_filter_addr_sync`, `function hinic3_filter_addr_unsync`, `function hinic3_clean_mac_list_filter`, `function list_for_each_entry_safe`, `function list_for_each_entry_safe`, `function hinic3_find_mac`, `function list_for_each_entry`, `function hinic3_add_filter`, `function hinic3_del_filter`, `function hinic3_mac_filter_entry_clone`.
- 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.