18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 28c2ecf20Sopenharmony_ci/* QLogic qedr NIC Driver 38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 QLogic Corporation 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/pci.h> 88c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 98c2ecf20Sopenharmony_ci#include <linux/list.h> 108c2ecf20Sopenharmony_ci#include <linux/mutex.h> 118c2ecf20Sopenharmony_ci#include <linux/qed/qede_rdma.h> 128c2ecf20Sopenharmony_ci#include "qede.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic struct qedr_driver *qedr_drv; 158c2ecf20Sopenharmony_cistatic LIST_HEAD(qedr_dev_list); 168c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(qedr_dev_list_lock); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cibool qede_rdma_supported(struct qede_dev *dev) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci return dev->dev_info.common.rdma_supported; 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistatic void _qede_rdma_dev_add(struct qede_dev *edev) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci if (!qedr_drv) 268c2ecf20Sopenharmony_ci return; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci /* Leftovers from previous error recovery */ 298c2ecf20Sopenharmony_ci edev->rdma_info.exp_recovery = false; 308c2ecf20Sopenharmony_ci edev->rdma_info.qedr_dev = qedr_drv->add(edev->cdev, edev->pdev, 318c2ecf20Sopenharmony_ci edev->ndev); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic int qede_rdma_create_wq(struct qede_dev *edev) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&edev->rdma_info.rdma_event_list); 378c2ecf20Sopenharmony_ci kref_init(&edev->rdma_info.refcnt); 388c2ecf20Sopenharmony_ci init_completion(&edev->rdma_info.event_comp); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci edev->rdma_info.rdma_wq = create_singlethread_workqueue("rdma_wq"); 418c2ecf20Sopenharmony_ci if (!edev->rdma_info.rdma_wq) { 428c2ecf20Sopenharmony_ci DP_NOTICE(edev, "qedr: Could not create workqueue\n"); 438c2ecf20Sopenharmony_ci return -ENOMEM; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci return 0; 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic void qede_rdma_cleanup_event(struct qede_dev *edev) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci struct list_head *head = &edev->rdma_info.rdma_event_list; 528c2ecf20Sopenharmony_ci struct qede_rdma_event_work *event_node; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci flush_workqueue(edev->rdma_info.rdma_wq); 558c2ecf20Sopenharmony_ci while (!list_empty(head)) { 568c2ecf20Sopenharmony_ci event_node = list_entry(head->next, struct qede_rdma_event_work, 578c2ecf20Sopenharmony_ci list); 588c2ecf20Sopenharmony_ci cancel_work_sync(&event_node->work); 598c2ecf20Sopenharmony_ci list_del(&event_node->list); 608c2ecf20Sopenharmony_ci kfree(event_node); 618c2ecf20Sopenharmony_ci } 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistatic void qede_rdma_complete_event(struct kref *ref) 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci struct qede_rdma_dev *rdma_dev = 678c2ecf20Sopenharmony_ci container_of(ref, struct qede_rdma_dev, refcnt); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* no more events will be added after this */ 708c2ecf20Sopenharmony_ci complete(&rdma_dev->event_comp); 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistatic void qede_rdma_destroy_wq(struct qede_dev *edev) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci /* Avoid race with add_event flow, make sure it finishes before 768c2ecf20Sopenharmony_ci * we start accessing the list and cleaning up the work 778c2ecf20Sopenharmony_ci */ 788c2ecf20Sopenharmony_ci kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); 798c2ecf20Sopenharmony_ci wait_for_completion(&edev->rdma_info.event_comp); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci qede_rdma_cleanup_event(edev); 828c2ecf20Sopenharmony_ci destroy_workqueue(edev->rdma_info.rdma_wq); 838c2ecf20Sopenharmony_ci edev->rdma_info.rdma_wq = NULL; 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ciint qede_rdma_dev_add(struct qede_dev *edev, bool recovery) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci int rc; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 918c2ecf20Sopenharmony_ci return 0; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci /* Cannot start qedr while recovering since it wasn't fully stopped */ 948c2ecf20Sopenharmony_ci if (recovery) 958c2ecf20Sopenharmony_ci return 0; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci rc = qede_rdma_create_wq(edev); 988c2ecf20Sopenharmony_ci if (rc) 998c2ecf20Sopenharmony_ci return rc; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&edev->rdma_info.entry); 1028c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1038c2ecf20Sopenharmony_ci list_add_tail(&edev->rdma_info.entry, &qedr_dev_list); 1048c2ecf20Sopenharmony_ci _qede_rdma_dev_add(edev); 1058c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci return rc; 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_cistatic void _qede_rdma_dev_remove(struct qede_dev *edev) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci if (qedr_drv && qedr_drv->remove && edev->rdma_info.qedr_dev) 1138c2ecf20Sopenharmony_ci qedr_drv->remove(edev->rdma_info.qedr_dev); 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_civoid qede_rdma_dev_remove(struct qede_dev *edev, bool recovery) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 1198c2ecf20Sopenharmony_ci return; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci /* Cannot remove qedr while recovering since it wasn't fully stopped */ 1228c2ecf20Sopenharmony_ci if (!recovery) { 1238c2ecf20Sopenharmony_ci qede_rdma_destroy_wq(edev); 1248c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1258c2ecf20Sopenharmony_ci if (!edev->rdma_info.exp_recovery) 1268c2ecf20Sopenharmony_ci _qede_rdma_dev_remove(edev); 1278c2ecf20Sopenharmony_ci edev->rdma_info.qedr_dev = NULL; 1288c2ecf20Sopenharmony_ci list_del(&edev->rdma_info.entry); 1298c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1308c2ecf20Sopenharmony_ci } else { 1318c2ecf20Sopenharmony_ci if (!edev->rdma_info.exp_recovery) { 1328c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1338c2ecf20Sopenharmony_ci _qede_rdma_dev_remove(edev); 1348c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1358c2ecf20Sopenharmony_ci } 1368c2ecf20Sopenharmony_ci edev->rdma_info.exp_recovery = true; 1378c2ecf20Sopenharmony_ci } 1388c2ecf20Sopenharmony_ci} 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cistatic void _qede_rdma_dev_open(struct qede_dev *edev) 1418c2ecf20Sopenharmony_ci{ 1428c2ecf20Sopenharmony_ci if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify) 1438c2ecf20Sopenharmony_ci qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_UP); 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic void qede_rdma_dev_open(struct qede_dev *edev) 1478c2ecf20Sopenharmony_ci{ 1488c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 1498c2ecf20Sopenharmony_ci return; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1528c2ecf20Sopenharmony_ci _qede_rdma_dev_open(edev); 1538c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1548c2ecf20Sopenharmony_ci} 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistatic void _qede_rdma_dev_close(struct qede_dev *edev) 1578c2ecf20Sopenharmony_ci{ 1588c2ecf20Sopenharmony_ci if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify) 1598c2ecf20Sopenharmony_ci qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_DOWN); 1608c2ecf20Sopenharmony_ci} 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistatic void qede_rdma_dev_close(struct qede_dev *edev) 1638c2ecf20Sopenharmony_ci{ 1648c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 1658c2ecf20Sopenharmony_ci return; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1688c2ecf20Sopenharmony_ci _qede_rdma_dev_close(edev); 1698c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1708c2ecf20Sopenharmony_ci} 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_cistatic void qede_rdma_dev_shutdown(struct qede_dev *edev) 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 1758c2ecf20Sopenharmony_ci return; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1788c2ecf20Sopenharmony_ci if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify) 1798c2ecf20Sopenharmony_ci qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_CLOSE); 1808c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1818c2ecf20Sopenharmony_ci} 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ciint qede_rdma_register_driver(struct qedr_driver *drv) 1848c2ecf20Sopenharmony_ci{ 1858c2ecf20Sopenharmony_ci struct qede_dev *edev; 1868c2ecf20Sopenharmony_ci u8 qedr_counter = 0; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 1898c2ecf20Sopenharmony_ci if (qedr_drv) { 1908c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 1918c2ecf20Sopenharmony_ci return -EINVAL; 1928c2ecf20Sopenharmony_ci } 1938c2ecf20Sopenharmony_ci qedr_drv = drv; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) { 1968c2ecf20Sopenharmony_ci struct net_device *ndev; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci qedr_counter++; 1998c2ecf20Sopenharmony_ci _qede_rdma_dev_add(edev); 2008c2ecf20Sopenharmony_ci ndev = edev->ndev; 2018c2ecf20Sopenharmony_ci if (netif_running(ndev) && netif_oper_up(ndev)) 2028c2ecf20Sopenharmony_ci _qede_rdma_dev_open(edev); 2038c2ecf20Sopenharmony_ci } 2048c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci pr_notice("qedr: discovered and registered %d RDMA funcs\n", 2078c2ecf20Sopenharmony_ci qedr_counter); 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci return 0; 2108c2ecf20Sopenharmony_ci} 2118c2ecf20Sopenharmony_ciEXPORT_SYMBOL(qede_rdma_register_driver); 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_civoid qede_rdma_unregister_driver(struct qedr_driver *drv) 2148c2ecf20Sopenharmony_ci{ 2158c2ecf20Sopenharmony_ci struct qede_dev *edev; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci mutex_lock(&qedr_dev_list_lock); 2188c2ecf20Sopenharmony_ci list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) { 2198c2ecf20Sopenharmony_ci /* If device has experienced recovery it was already removed */ 2208c2ecf20Sopenharmony_ci if (edev->rdma_info.qedr_dev && !edev->rdma_info.exp_recovery) 2218c2ecf20Sopenharmony_ci _qede_rdma_dev_remove(edev); 2228c2ecf20Sopenharmony_ci } 2238c2ecf20Sopenharmony_ci qedr_drv = NULL; 2248c2ecf20Sopenharmony_ci mutex_unlock(&qedr_dev_list_lock); 2258c2ecf20Sopenharmony_ci} 2268c2ecf20Sopenharmony_ciEXPORT_SYMBOL(qede_rdma_unregister_driver); 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistatic void qede_rdma_changeaddr(struct qede_dev *edev) 2298c2ecf20Sopenharmony_ci{ 2308c2ecf20Sopenharmony_ci if (!qede_rdma_supported(edev)) 2318c2ecf20Sopenharmony_ci return; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify) 2348c2ecf20Sopenharmony_ci qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_CHANGE_ADDR); 2358c2ecf20Sopenharmony_ci} 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_cistatic void qede_rdma_change_mtu(struct qede_dev *edev) 2388c2ecf20Sopenharmony_ci{ 2398c2ecf20Sopenharmony_ci if (qede_rdma_supported(edev)) { 2408c2ecf20Sopenharmony_ci if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify) 2418c2ecf20Sopenharmony_ci qedr_drv->notify(edev->rdma_info.qedr_dev, 2428c2ecf20Sopenharmony_ci QEDE_CHANGE_MTU); 2438c2ecf20Sopenharmony_ci } 2448c2ecf20Sopenharmony_ci} 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_cistatic struct qede_rdma_event_work * 2478c2ecf20Sopenharmony_ciqede_rdma_get_free_event_node(struct qede_dev *edev) 2488c2ecf20Sopenharmony_ci{ 2498c2ecf20Sopenharmony_ci struct qede_rdma_event_work *event_node = NULL; 2508c2ecf20Sopenharmony_ci struct list_head *list_node = NULL; 2518c2ecf20Sopenharmony_ci bool found = false; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci list_for_each(list_node, &edev->rdma_info.rdma_event_list) { 2548c2ecf20Sopenharmony_ci event_node = list_entry(list_node, struct qede_rdma_event_work, 2558c2ecf20Sopenharmony_ci list); 2568c2ecf20Sopenharmony_ci if (!work_pending(&event_node->work)) { 2578c2ecf20Sopenharmony_ci found = true; 2588c2ecf20Sopenharmony_ci break; 2598c2ecf20Sopenharmony_ci } 2608c2ecf20Sopenharmony_ci } 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci if (!found) { 2638c2ecf20Sopenharmony_ci event_node = kzalloc(sizeof(*event_node), GFP_ATOMIC); 2648c2ecf20Sopenharmony_ci if (!event_node) { 2658c2ecf20Sopenharmony_ci DP_NOTICE(edev, 2668c2ecf20Sopenharmony_ci "qedr: Could not allocate memory for rdma work\n"); 2678c2ecf20Sopenharmony_ci return NULL; 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci list_add_tail(&event_node->list, 2708c2ecf20Sopenharmony_ci &edev->rdma_info.rdma_event_list); 2718c2ecf20Sopenharmony_ci } 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci return event_node; 2748c2ecf20Sopenharmony_ci} 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_cistatic void qede_rdma_handle_event(struct work_struct *work) 2778c2ecf20Sopenharmony_ci{ 2788c2ecf20Sopenharmony_ci struct qede_rdma_event_work *event_node; 2798c2ecf20Sopenharmony_ci enum qede_rdma_event event; 2808c2ecf20Sopenharmony_ci struct qede_dev *edev; 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ci event_node = container_of(work, struct qede_rdma_event_work, work); 2838c2ecf20Sopenharmony_ci event = event_node->event; 2848c2ecf20Sopenharmony_ci edev = event_node->ptr; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci switch (event) { 2878c2ecf20Sopenharmony_ci case QEDE_UP: 2888c2ecf20Sopenharmony_ci qede_rdma_dev_open(edev); 2898c2ecf20Sopenharmony_ci break; 2908c2ecf20Sopenharmony_ci case QEDE_DOWN: 2918c2ecf20Sopenharmony_ci qede_rdma_dev_close(edev); 2928c2ecf20Sopenharmony_ci break; 2938c2ecf20Sopenharmony_ci case QEDE_CLOSE: 2948c2ecf20Sopenharmony_ci qede_rdma_dev_shutdown(edev); 2958c2ecf20Sopenharmony_ci break; 2968c2ecf20Sopenharmony_ci case QEDE_CHANGE_ADDR: 2978c2ecf20Sopenharmony_ci qede_rdma_changeaddr(edev); 2988c2ecf20Sopenharmony_ci break; 2998c2ecf20Sopenharmony_ci case QEDE_CHANGE_MTU: 3008c2ecf20Sopenharmony_ci qede_rdma_change_mtu(edev); 3018c2ecf20Sopenharmony_ci break; 3028c2ecf20Sopenharmony_ci default: 3038c2ecf20Sopenharmony_ci DP_NOTICE(edev, "Invalid rdma event %d", event); 3048c2ecf20Sopenharmony_ci } 3058c2ecf20Sopenharmony_ci} 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_cistatic void qede_rdma_add_event(struct qede_dev *edev, 3088c2ecf20Sopenharmony_ci enum qede_rdma_event event) 3098c2ecf20Sopenharmony_ci{ 3108c2ecf20Sopenharmony_ci struct qede_rdma_event_work *event_node; 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci /* If a recovery was experienced avoid adding the event */ 3138c2ecf20Sopenharmony_ci if (edev->rdma_info.exp_recovery) 3148c2ecf20Sopenharmony_ci return; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci if (!edev->rdma_info.qedr_dev || !edev->rdma_info.rdma_wq) 3178c2ecf20Sopenharmony_ci return; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci /* We don't want the cleanup flow to start while we're allocating and 3208c2ecf20Sopenharmony_ci * scheduling the work 3218c2ecf20Sopenharmony_ci */ 3228c2ecf20Sopenharmony_ci if (!kref_get_unless_zero(&edev->rdma_info.refcnt)) 3238c2ecf20Sopenharmony_ci return; /* already being destroyed */ 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci event_node = qede_rdma_get_free_event_node(edev); 3268c2ecf20Sopenharmony_ci if (!event_node) 3278c2ecf20Sopenharmony_ci goto out; 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci event_node->event = event; 3308c2ecf20Sopenharmony_ci event_node->ptr = edev; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci INIT_WORK(&event_node->work, qede_rdma_handle_event); 3338c2ecf20Sopenharmony_ci queue_work(edev->rdma_info.rdma_wq, &event_node->work); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ciout: 3368c2ecf20Sopenharmony_ci kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); 3378c2ecf20Sopenharmony_ci} 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_civoid qede_rdma_dev_event_open(struct qede_dev *edev) 3408c2ecf20Sopenharmony_ci{ 3418c2ecf20Sopenharmony_ci qede_rdma_add_event(edev, QEDE_UP); 3428c2ecf20Sopenharmony_ci} 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_civoid qede_rdma_dev_event_close(struct qede_dev *edev) 3458c2ecf20Sopenharmony_ci{ 3468c2ecf20Sopenharmony_ci qede_rdma_add_event(edev, QEDE_DOWN); 3478c2ecf20Sopenharmony_ci} 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_civoid qede_rdma_event_changeaddr(struct qede_dev *edev) 3508c2ecf20Sopenharmony_ci{ 3518c2ecf20Sopenharmony_ci qede_rdma_add_event(edev, QEDE_CHANGE_ADDR); 3528c2ecf20Sopenharmony_ci} 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_civoid qede_rdma_event_change_mtu(struct qede_dev *edev) 3558c2ecf20Sopenharmony_ci{ 3568c2ecf20Sopenharmony_ci qede_rdma_add_event(edev, QEDE_CHANGE_MTU); 3578c2ecf20Sopenharmony_ci} 358