drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/cavium/liquidio/lio_vf_main.c- Extension
.c- Size
- 65699 bytes
- Lines
- 2425
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/interrupt.hlinux/pci.hnet/vxlan.hliquidio_common.hocteon_droq.hocteon_iq.hresponse_manager.hocteon_device.hocteon_nic.hocteon_main.hocteon_network.hcn23xx_vf_device.h
Detected Declarations
struct oct_timestamp_respfunction lio_wait_for_oq_pktsfunction pcierror_quiesce_devicefunction cleanup_aer_uncorrect_error_statusfunction stop_pci_iofunction liquidio_pcie_error_detectedfunction print_link_infofunction octnet_link_status_changefunction setup_link_status_change_wqfunction cleanup_link_status_change_wqfunction update_link_statusfunction liquidio_vf_probefunction octeon_pci_flrfunction octeon_destroy_resourcesfunction send_rx_ctrl_cmdfunction liquidio_destroy_nic_devicefunction liquidio_stop_nic_modulefunction liquidio_vf_removefunction octeon_pci_os_setupfunction free_netbuffunction free_netsgbuffunction free_netsgbuf_with_respfunction liquidio_openfunction liquidio_stopfunction get_new_flagsfunction liquidio_set_uc_listfunction liquidio_set_mcast_listfunction liquidio_set_macfunction liquidio_get_stats64function liquidio_hwtstamp_setfunction liquidio_hwtstamp_getfunction handle_timestampfunction send_nic_timestamp_pktfunction liquidio_xmitfunction liquidio_tx_timeoutfunction liquidio_vlan_rx_add_vidfunction liquidio_vlan_rx_kill_vidfunction liquidio_set_rxcsum_commandfunction liquidio_vxlan_port_commandfunction liquidio_udp_tunnel_set_portfunction liquidio_udp_tunnel_unset_portfunction liquidio_fix_featuresfunction liquidio_set_featuresfunction lio_nic_infofunction setup_nic_devicesfunction liquidio_init_nic_modulefunction octeon_device_initfunction liquidio_vf_init
Annotated Snippet
static struct pci_driver liquidio_vf_pci_driver = {
.name = "LiquidIO_VF",
.id_table = liquidio_vf_pci_tbl,
.probe = liquidio_vf_probe,
.remove = liquidio_vf_remove,
.err_handler = &liquidio_vf_err_handler, /* For AER */
};
/**
* print_link_info - Print link information
* @netdev: network device
*/
static void print_link_info(struct net_device *netdev)
{
struct lio *lio = GET_LIO(netdev);
if (!ifstate_check(lio, LIO_IFSTATE_RESETTING) &&
ifstate_check(lio, LIO_IFSTATE_REGISTERED)) {
struct oct_link_info *linfo = &lio->linfo;
if (linfo->link.s.link_up) {
netif_info(lio, link, lio->netdev, "%d Mbps %s Duplex UP\n",
linfo->link.s.speed,
(linfo->link.s.duplex) ? "Full" : "Half");
} else {
netif_info(lio, link, lio->netdev, "Link Down\n");
}
}
}
/**
* octnet_link_status_change - Routine to notify MTU change
* @work: work_struct data structure
*/
static void octnet_link_status_change(struct work_struct *work)
{
struct cavium_wk *wk = (struct cavium_wk *)work;
struct lio *lio = (struct lio *)wk->ctxptr;
/* lio->linfo.link.s.mtu always contains max MTU of the lio interface.
* this API is invoked only when new max-MTU of the interface is
* less than current MTU.
*/
rtnl_lock();
dev_set_mtu(lio->netdev, lio->linfo.link.s.mtu);
rtnl_unlock();
}
/**
* setup_link_status_change_wq - Sets up the mtu status change work
* @netdev: network device
*/
static int setup_link_status_change_wq(struct net_device *netdev)
{
struct lio *lio = GET_LIO(netdev);
struct octeon_device *oct = lio->oct_dev;
lio->link_status_wq.wq = alloc_workqueue("link-status",
WQ_MEM_RECLAIM | WQ_PERCPU,
0);
if (!lio->link_status_wq.wq) {
dev_err(&oct->pci_dev->dev, "unable to create cavium link status wq\n");
return -1;
}
INIT_DELAYED_WORK(&lio->link_status_wq.wk.work,
octnet_link_status_change);
lio->link_status_wq.wk.ctxptr = lio;
return 0;
}
static void cleanup_link_status_change_wq(struct net_device *netdev)
{
struct lio *lio = GET_LIO(netdev);
if (lio->link_status_wq.wq) {
cancel_delayed_work_sync(&lio->link_status_wq.wk.work);
destroy_workqueue(lio->link_status_wq.wq);
}
}
/**
* update_link_status - Update link status
* @netdev: network device
* @ls: link status structure
*
* Called on receipt of a link status response from the core application to
* update each interface's link status.
*/
static void update_link_status(struct net_device *netdev,
Annotation
- Immediate include surface: `linux/module.h`, `linux/interrupt.h`, `linux/pci.h`, `net/vxlan.h`, `liquidio_common.h`, `octeon_droq.h`, `octeon_iq.h`, `response_manager.h`.
- Detected declarations: `struct oct_timestamp_resp`, `function lio_wait_for_oq_pkts`, `function pcierror_quiesce_device`, `function cleanup_aer_uncorrect_error_status`, `function stop_pci_io`, `function liquidio_pcie_error_detected`, `function print_link_info`, `function octnet_link_status_change`, `function setup_link_status_change_wq`, `function cleanup_link_status_change_wq`.
- 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.