drivers/net/ethernet/qlogic/qede/qede_rdma.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/qlogic/qede/qede_rdma.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/qlogic/qede/qede_rdma.c- Extension
.c- Size
- 8666 bytes
- Lines
- 356
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/pci.hlinux/netdevice.hlinux/list.hlinux/mutex.hlinux/qed/qede_rdma.hqede.h
Detected Declarations
function qede_rdma_supportedfunction _qede_rdma_dev_addfunction qede_rdma_create_wqfunction qede_rdma_cleanup_eventfunction qede_rdma_complete_eventfunction qede_rdma_destroy_wqfunction qede_rdma_dev_addfunction _qede_rdma_dev_removefunction qede_rdma_dev_removefunction _qede_rdma_dev_openfunction qede_rdma_dev_openfunction _qede_rdma_dev_closefunction qede_rdma_dev_closefunction qede_rdma_dev_shutdownfunction qede_rdma_register_driverfunction list_for_each_entryfunction qede_rdma_unregister_driverfunction qede_rdma_changeaddrfunction qede_rdma_change_mtufunction qede_rdma_get_free_event_nodefunction list_for_each_entryfunction qede_rdma_handle_eventfunction qede_rdma_add_eventfunction qede_rdma_dev_event_openfunction qede_rdma_dev_event_closefunction qede_rdma_event_changeaddrfunction qede_rdma_event_change_mtuexport qede_rdma_register_driverexport qede_rdma_unregister_driver
Annotated Snippet
if (!edev->rdma_info.exp_recovery) {
mutex_lock(&qedr_dev_list_lock);
_qede_rdma_dev_remove(edev);
mutex_unlock(&qedr_dev_list_lock);
}
edev->rdma_info.exp_recovery = true;
}
}
static void _qede_rdma_dev_open(struct qede_dev *edev)
{
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_UP);
}
static void qede_rdma_dev_open(struct qede_dev *edev)
{
if (!qede_rdma_supported(edev))
return;
mutex_lock(&qedr_dev_list_lock);
_qede_rdma_dev_open(edev);
mutex_unlock(&qedr_dev_list_lock);
}
static void _qede_rdma_dev_close(struct qede_dev *edev)
{
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_DOWN);
}
static void qede_rdma_dev_close(struct qede_dev *edev)
{
if (!qede_rdma_supported(edev))
return;
mutex_lock(&qedr_dev_list_lock);
_qede_rdma_dev_close(edev);
mutex_unlock(&qedr_dev_list_lock);
}
static void qede_rdma_dev_shutdown(struct qede_dev *edev)
{
if (!qede_rdma_supported(edev))
return;
mutex_lock(&qedr_dev_list_lock);
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_CLOSE);
mutex_unlock(&qedr_dev_list_lock);
}
int qede_rdma_register_driver(struct qedr_driver *drv)
{
struct qede_dev *edev;
u8 qedr_counter = 0;
mutex_lock(&qedr_dev_list_lock);
if (qedr_drv) {
mutex_unlock(&qedr_dev_list_lock);
return -EINVAL;
}
qedr_drv = drv;
list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) {
struct net_device *ndev;
qedr_counter++;
_qede_rdma_dev_add(edev);
ndev = edev->ndev;
if (netif_running(ndev) && netif_oper_up(ndev))
_qede_rdma_dev_open(edev);
}
mutex_unlock(&qedr_dev_list_lock);
pr_notice("qedr: discovered and registered %d RDMA funcs\n",
qedr_counter);
return 0;
}
EXPORT_SYMBOL(qede_rdma_register_driver);
void qede_rdma_unregister_driver(struct qedr_driver *drv)
{
struct qede_dev *edev;
mutex_lock(&qedr_dev_list_lock);
list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) {
/* If device has experienced recovery it was already removed */
if (edev->rdma_info.qedr_dev && !edev->rdma_info.exp_recovery)
Annotation
- Immediate include surface: `linux/pci.h`, `linux/netdevice.h`, `linux/list.h`, `linux/mutex.h`, `linux/qed/qede_rdma.h`, `qede.h`.
- Detected declarations: `function qede_rdma_supported`, `function _qede_rdma_dev_add`, `function qede_rdma_create_wq`, `function qede_rdma_cleanup_event`, `function qede_rdma_complete_event`, `function qede_rdma_destroy_wq`, `function qede_rdma_dev_add`, `function _qede_rdma_dev_remove`, `function qede_rdma_dev_remove`, `function _qede_rdma_dev_open`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.