drivers/net/wireless/ath/ath12k/pci.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/ath/ath12k/pci.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/ath/ath12k/pci.c
Extension
.c
Size
48030 bytes
Lines
1849
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct pci_driver *pci_driver;

	if (device_id >= ATH12K_DEVICE_FAMILY_MAX)
		return -EINVAL;

	if (!driver || !driver->ops.probe ||
	    !driver->ops.arch_init || !driver->ops.arch_deinit)
		return -EINVAL;

	if (ath12k_pci_family_drivers[device_id]) {
		pr_err("Driver already registered for %d\n", device_id);
		return -EALREADY;
	}

	ath12k_pci_family_drivers[device_id] = driver;

	pci_driver = &ath12k_pci_family_drivers[device_id]->driver;
	pci_driver->name = driver->name;
	pci_driver->id_table = driver->id_table;
	pci_driver->probe = ath12k_pci_probe;
	pci_driver->remove = ath12k_pci_remove;
	pci_driver->shutdown = ath12k_pci_shutdown;
	pci_driver->driver.pm = &ath12k_pci_pm_ops;

	return pci_register_driver(pci_driver);
}
EXPORT_SYMBOL(ath12k_pci_register_driver);

void ath12k_pci_unregister_driver(const enum ath12k_device_family device_id)
{
	if (device_id >= ATH12K_DEVICE_FAMILY_MAX ||
	    !ath12k_pci_family_drivers[device_id])
		return;

	pci_unregister_driver(&ath12k_pci_family_drivers[device_id]->driver);
	ath12k_pci_family_drivers[device_id] = NULL;
}
EXPORT_SYMBOL(ath12k_pci_unregister_driver);

/* firmware files */
MODULE_FIRMWARE(ATH12K_FW_DIR "/QCN9274/hw2.0/*");
MODULE_FIRMWARE(ATH12K_FW_DIR "/WCN7850/hw2.0/*");

Annotation

Implementation Notes