drivers/net/ethernet/ibm/ibmvnic.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/ibm/ibmvnic.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/ibm/ibmvnic.c- Extension
.c- Size
- 190660 bytes
- Lines
- 6798
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern 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 an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/module.hlinux/moduleparam.hlinux/types.hlinux/errno.hlinux/completion.hlinux/ioport.hlinux/dma-mapping.hlinux/kernel.hlinux/netdevice.hlinux/etherdevice.hlinux/skbuff.hlinux/init.hlinux/delay.hlinux/mm.hlinux/ethtool.hlinux/proc_fs.hlinux/if_arp.hlinux/in.hlinux/ip.hlinux/ipv6.hlinux/irq.hlinux/irqdomain.hlinux/kthread.hlinux/seq_file.hlinux/interrupt.hnet/net_namespace.hasm/hvcall.hlinux/atomic.hasm/vio.hasm/xive.hasm/iommu.hlinux/uaccess.h
Detected Declarations
struct ibmvnic_statstruct vnic_login_client_datafunction send_crq_init_completefunction send_version_xchgfunction ibmvnic_clean_queue_affinityfunction ibmvnic_clean_affinityfunction ibmvnic_set_queue_affinityfunction ibmvnic_set_affinityfunction ibmvnic_cpu_onlinefunction ibmvnic_cpu_deadfunction ibmvnic_cpu_down_prepfunction ibmvnic_cpu_notif_addfunction ibmvnic_cpu_notif_removefunction h_reg_sub_crqfunction ibmvnic_wait_for_completionfunction reuse_ltbfunction alloc_long_term_bufffunction free_long_term_bufffunction free_ltb_setfunction alloc_ltb_setfunction alloc_ltb_setfunction map_txpool_buf_to_ltbfunction deactivate_rx_poolsfunction ibmvnic_set_safe_max_ind_descsfunction replenish_rx_poolfunction replenish_poolsfunction release_stats_buffersfunction init_stats_buffersfunction release_stats_tokenfunction init_stats_tokenfunction release_rx_poolsfunction reuse_rx_poolsfunction init_rx_poolsfunction release_vpd_datafunction release_one_tx_poolfunction release_tx_poolsfunction init_one_tx_poolfunction reuse_tx_poolsfunction init_tx_poolsfunction ibmvnic_napi_enablefunction ibmvnic_napi_disablefunction init_napifunction release_napifunction ibmvnic_loginfunction release_login_bufferfunction release_login_rsp_bufferfunction release_resourcesfunction set_link_state
Annotated Snippet
static const struct net_device_ops ibmvnic_netdev_ops = {
.ndo_open = ibmvnic_open,
.ndo_stop = ibmvnic_close,
.ndo_start_xmit = ibmvnic_xmit,
.ndo_set_rx_mode = ibmvnic_set_multi,
.ndo_set_mac_address = ibmvnic_set_mac,
.ndo_validate_addr = eth_validate_addr,
.ndo_get_stats64 = ibmvnic_get_stats64,
.ndo_tx_timeout = ibmvnic_tx_timeout,
.ndo_change_mtu = ibmvnic_change_mtu,
.ndo_features_check = ibmvnic_features_check,
};
/* ethtool functions */
static int ibmvnic_get_link_ksettings(struct net_device *netdev,
struct ethtool_link_ksettings *cmd)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
int rc;
rc = send_query_phys_parms(adapter);
if (rc) {
adapter->speed = SPEED_UNKNOWN;
adapter->duplex = DUPLEX_UNKNOWN;
}
cmd->base.speed = adapter->speed;
cmd->base.duplex = adapter->duplex;
cmd->base.port = PORT_FIBRE;
cmd->base.phy_address = 0;
cmd->base.autoneg = AUTONEG_ENABLE;
return 0;
}
static void ibmvnic_get_drvinfo(struct net_device *netdev,
struct ethtool_drvinfo *info)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
strscpy(info->driver, ibmvnic_driver_name, sizeof(info->driver));
strscpy(info->version, IBMVNIC_DRIVER_VERSION, sizeof(info->version));
strscpy(info->fw_version, adapter->fw_version,
sizeof(info->fw_version));
}
static u32 ibmvnic_get_msglevel(struct net_device *netdev)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
return adapter->msg_enable;
}
static void ibmvnic_set_msglevel(struct net_device *netdev, u32 data)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
adapter->msg_enable = data;
}
static u32 ibmvnic_get_link(struct net_device *netdev)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
/* Don't need to send a query because we request a logical link up at
* init and then we wait for link state indications
*/
return adapter->logical_link_state;
}
static void ibmvnic_get_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring,
struct kernel_ethtool_ringparam *kernel_ring,
struct netlink_ext_ack *extack)
{
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq;
ring->tx_max_pending = adapter->max_tx_entries_per_subcrq;
ring->rx_mini_max_pending = 0;
ring->rx_jumbo_max_pending = 0;
ring->rx_pending = adapter->req_rx_add_entries_per_subcrq;
ring->tx_pending = adapter->req_tx_entries_per_subcrq;
ring->rx_mini_pending = 0;
ring->rx_jumbo_pending = 0;
}
static int ibmvnic_set_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring,
struct kernel_ethtool_ringparam *kernel_ring,
Annotation
- Immediate include surface: `linux/module.h`, `linux/moduleparam.h`, `linux/types.h`, `linux/errno.h`, `linux/completion.h`, `linux/ioport.h`, `linux/dma-mapping.h`, `linux/kernel.h`.
- Detected declarations: `struct ibmvnic_stat`, `struct vnic_login_client_data`, `function send_crq_init_complete`, `function send_version_xchg`, `function ibmvnic_clean_queue_affinity`, `function ibmvnic_clean_affinity`, `function ibmvnic_set_queue_affinity`, `function ibmvnic_set_affinity`, `function ibmvnic_cpu_online`, `function ibmvnic_cpu_dead`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: pattern implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.