rdma_info
struct rdma_info *rdma = data;
struct qed_rdma_info *rdma_info;
rdma_info = p_hwfn->p_rdma_info;
if (QED_IS_RDMA_PERSONALITY(p_hwfn) && rdma_info) {
qed_spq_unregister_async_cb(p_hwfn, rdma_info->proto);
struct qede_rdma_dev rdma_info;
INIT_LIST_HEAD(&edev->rdma_info.entry);
list_add_tail(&edev->rdma_info.entry, &qedr_dev_list);
if (qedr_drv && qedr_drv->remove && edev->rdma_info.qedr_dev)
qedr_drv->remove(edev->rdma_info.qedr_dev);
if (!edev->rdma_info.exp_recovery)
edev->rdma_info.qedr_dev = NULL;
list_del(&edev->rdma_info.entry);
if (!edev->rdma_info.exp_recovery) {
edev->rdma_info.exp_recovery = true;
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_UP);
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_DOWN);
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_CLOSE);
list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) {
list_for_each_entry(edev, &qedr_dev_list, rdma_info.entry) {
if (edev->rdma_info.qedr_dev && !edev->rdma_info.exp_recovery)
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev, QEDE_CHANGE_ADDR);
if (qedr_drv && edev->rdma_info.qedr_dev && qedr_drv->notify)
qedr_drv->notify(edev->rdma_info.qedr_dev,
list_for_each_entry(event_node, &edev->rdma_info.rdma_event_list,
&edev->rdma_info.rdma_event_list);
edev->rdma_info.exp_recovery = false;
edev->rdma_info.qedr_dev = qedr_drv->add(edev->cdev, edev->pdev,
if (edev->rdma_info.exp_recovery)
if (!edev->rdma_info.qedr_dev || !edev->rdma_info.rdma_wq)
if (!kref_get_unless_zero(&edev->rdma_info.refcnt))
queue_work(edev->rdma_info.rdma_wq, &event_node->work);
kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event);
INIT_LIST_HEAD(&edev->rdma_info.rdma_event_list);
kref_init(&edev->rdma_info.refcnt);
init_completion(&edev->rdma_info.event_comp);
edev->rdma_info.rdma_wq = create_singlethread_workqueue("rdma_wq");
if (!edev->rdma_info.rdma_wq) {
struct list_head *head = &edev->rdma_info.rdma_event_list;
flush_workqueue(edev->rdma_info.rdma_wq);
kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event);
wait_for_completion(&edev->rdma_info.event_comp);
destroy_workqueue(edev->rdma_info.rdma_wq);
edev->rdma_info.rdma_wq = NULL;