drivers/net/ethernet/cavium/liquidio/lio_main.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/cavium/liquidio/lio_main.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/cavium/liquidio/lio_main.c- Extension
.c- Size
- 118699 bytes
- Lines
- 4348
- 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.hlinux/firmware.hnet/vxlan.hlinux/kthread.hliquidio_common.hocteon_droq.hocteon_iq.hresponse_manager.hocteon_device.hocteon_nic.hocteon_main.hocteon_network.hcn66xx_regs.hcn66xx_device.hcn68xx_device.hcn23xx_pf_device.hliquidio_image.hlio_vf_rep.h
Detected Declarations
struct oct_timestamp_respstruct handshakefunction octeon_console_debug_enabledfunction octeon_droq_bhfunction lio_wait_for_oq_pktsfunction force_io_queues_offfunction pcierror_quiesce_devicefunction cleanup_aer_uncorrect_error_statusfunction stop_pci_iofunction liquidio_pcie_error_detectedfunction liquidio_pcie_mmio_enabledfunction liquidio_pcie_slot_resetfunction liquidio_pcie_resumefunction liquidio_init_pcifunction liquidio_deinit_pcifunction check_txq_statusfunction print_link_infofunction octnet_link_status_changefunction setup_link_status_change_wqfunction cleanup_link_status_change_wqfunction update_link_statusfunction lio_sync_octeon_timefunction setup_sync_octeon_time_wqfunction cleanup_sync_octeon_time_wqfunction disable_all_vf_linksfunction liquidio_watchdogfunction liquidio_probefunction fw_type_is_autofunction octeon_pci_flrfunction octeon_destroy_resourcesfunction send_rx_ctrl_cmdfunction liquidio_destroy_nic_devicefunction liquidio_stop_nic_modulefunction liquidio_removefunction octeon_chip_specific_setupfunction octeon_pci_os_setupfunction free_netbuffunction free_netsgbuffunction free_netsgbuf_with_respfunction liquidio_ptp_adjfinefunction liquidio_ptp_adjtimefunction liquidio_ptp_gettimefunction liquidio_ptp_settimefunction liquidio_ptp_enablefunction oct_ptp_openfunction liquidio_ptp_initfunction load_firmwarefunction octnet_poll_check_txq_status
Annotated Snippet
static struct pci_driver liquidio_pci_driver = {
.name = "LiquidIO",
.id_table = liquidio_pci_tbl,
.probe = liquidio_probe,
.remove = liquidio_remove,
.err_handler = &liquidio_err_handler, /* For AER */
.driver.pm = &liquidio_pm_ops,
#ifdef CONFIG_PCI_IOV
.sriov_configure = liquidio_enable_sriov,
#endif
};
/**
* liquidio_init_pci - register PCI driver
*/
static int liquidio_init_pci(void)
{
return pci_register_driver(&liquidio_pci_driver);
}
/**
* liquidio_deinit_pci - unregister PCI driver
*/
static void liquidio_deinit_pci(void)
{
pci_unregister_driver(&liquidio_pci_driver);
}
/**
* check_txq_status - Check Tx queue status, and take appropriate action
* @lio: per-network private data
* Return: 0 if full, number of queues woken up otherwise
*/
static inline int check_txq_status(struct lio *lio)
{
int numqs = lio->netdev->real_num_tx_queues;
int ret_val = 0;
int q, iq;
/* check each sub-queue state */
for (q = 0; q < numqs; q++) {
iq = lio->linfo.txpciq[q %
lio->oct_dev->num_iqs].s.q_no;
if (octnet_iq_is_full(lio->oct_dev, iq))
continue;
if (__netif_subqueue_stopped(lio->netdev, q)) {
netif_wake_subqueue(lio->netdev, q);
INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq,
tx_restart, 1);
ret_val++;
}
}
return ret_val;
}
/**
* 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.
Annotation
- Immediate include surface: `linux/module.h`, `linux/interrupt.h`, `linux/pci.h`, `linux/firmware.h`, `net/vxlan.h`, `linux/kthread.h`, `liquidio_common.h`, `octeon_droq.h`.
- Detected declarations: `struct oct_timestamp_resp`, `struct handshake`, `function octeon_console_debug_enabled`, `function octeon_droq_bh`, `function lio_wait_for_oq_pkts`, `function force_io_queues_off`, `function pcierror_quiesce_device`, `function cleanup_aer_uncorrect_error_status`, `function stop_pci_io`, `function liquidio_pcie_error_detected`.
- 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.