162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2021 Intel Corporation */
362306a36Sopenharmony_ci#include "main.h"
462306a36Sopenharmony_ci#include "../../../net/ethernet/intel/ice/ice.h"
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciMODULE_ALIAS("i40iw");
762306a36Sopenharmony_ciMODULE_AUTHOR("Intel Corporation, <e1000-rdma@lists.sourceforge.net>");
862306a36Sopenharmony_ciMODULE_DESCRIPTION("Intel(R) Ethernet Protocol Driver for RDMA");
962306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL");
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic struct notifier_block irdma_inetaddr_notifier = {
1262306a36Sopenharmony_ci	.notifier_call = irdma_inetaddr_event
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic struct notifier_block irdma_inetaddr6_notifier = {
1662306a36Sopenharmony_ci	.notifier_call = irdma_inet6addr_event
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic struct notifier_block irdma_net_notifier = {
2062306a36Sopenharmony_ci	.notifier_call = irdma_net_event
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic struct notifier_block irdma_netdevice_notifier = {
2462306a36Sopenharmony_ci	.notifier_call = irdma_netdevice_event
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic void irdma_register_notifiers(void)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	register_inetaddr_notifier(&irdma_inetaddr_notifier);
3062306a36Sopenharmony_ci	register_inet6addr_notifier(&irdma_inetaddr6_notifier);
3162306a36Sopenharmony_ci	register_netevent_notifier(&irdma_net_notifier);
3262306a36Sopenharmony_ci	register_netdevice_notifier(&irdma_netdevice_notifier);
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic void irdma_unregister_notifiers(void)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	unregister_netevent_notifier(&irdma_net_notifier);
3862306a36Sopenharmony_ci	unregister_inetaddr_notifier(&irdma_inetaddr_notifier);
3962306a36Sopenharmony_ci	unregister_inet6addr_notifier(&irdma_inetaddr6_notifier);
4062306a36Sopenharmony_ci	unregister_netdevice_notifier(&irdma_netdevice_notifier);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic void irdma_prep_tc_change(struct irdma_device *iwdev)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	iwdev->vsi.tc_change_pending = true;
4662306a36Sopenharmony_ci	irdma_sc_suspend_resume_qps(&iwdev->vsi, IRDMA_OP_SUSPEND);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	/* Wait for all qp's to suspend */
4962306a36Sopenharmony_ci	wait_event_timeout(iwdev->suspend_wq,
5062306a36Sopenharmony_ci			   !atomic_read(&iwdev->vsi.qp_suspend_reqs),
5162306a36Sopenharmony_ci			   msecs_to_jiffies(IRDMA_EVENT_TIMEOUT_MS));
5262306a36Sopenharmony_ci	irdma_ws_reset(&iwdev->vsi);
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic void irdma_log_invalid_mtu(u16 mtu, struct irdma_sc_dev *dev)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	if (mtu < IRDMA_MIN_MTU_IPV4)
5862306a36Sopenharmony_ci		ibdev_warn(to_ibdev(dev), "MTU setting [%d] too low for RDMA traffic. Minimum MTU is 576 for IPv4\n", mtu);
5962306a36Sopenharmony_ci	else if (mtu < IRDMA_MIN_MTU_IPV6)
6062306a36Sopenharmony_ci		ibdev_warn(to_ibdev(dev), "MTU setting [%d] too low for RDMA traffic. Minimum MTU is 1280 for IPv6\\n", mtu);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic void irdma_fill_qos_info(struct irdma_l2params *l2params,
6462306a36Sopenharmony_ci				struct iidc_qos_params *qos_info)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	int i;
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	l2params->num_tc = qos_info->num_tc;
6962306a36Sopenharmony_ci	l2params->vsi_prio_type = qos_info->vport_priority_type;
7062306a36Sopenharmony_ci	l2params->vsi_rel_bw = qos_info->vport_relative_bw;
7162306a36Sopenharmony_ci	for (i = 0; i < l2params->num_tc; i++) {
7262306a36Sopenharmony_ci		l2params->tc_info[i].egress_virt_up =
7362306a36Sopenharmony_ci			qos_info->tc_info[i].egress_virt_up;
7462306a36Sopenharmony_ci		l2params->tc_info[i].ingress_virt_up =
7562306a36Sopenharmony_ci			qos_info->tc_info[i].ingress_virt_up;
7662306a36Sopenharmony_ci		l2params->tc_info[i].prio_type = qos_info->tc_info[i].prio_type;
7762306a36Sopenharmony_ci		l2params->tc_info[i].rel_bw = qos_info->tc_info[i].rel_bw;
7862306a36Sopenharmony_ci		l2params->tc_info[i].tc_ctx = qos_info->tc_info[i].tc_ctx;
7962306a36Sopenharmony_ci	}
8062306a36Sopenharmony_ci	for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++)
8162306a36Sopenharmony_ci		l2params->up2tc[i] = qos_info->up2tc[i];
8262306a36Sopenharmony_ci	if (qos_info->pfc_mode == IIDC_DSCP_PFC_MODE) {
8362306a36Sopenharmony_ci		l2params->dscp_mode = true;
8462306a36Sopenharmony_ci		memcpy(l2params->dscp_map, qos_info->dscp_map, sizeof(l2params->dscp_map));
8562306a36Sopenharmony_ci	}
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	struct irdma_device *iwdev = dev_get_drvdata(&pf->adev->dev);
9162306a36Sopenharmony_ci	struct irdma_l2params l2params = {};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	if (*event->type & BIT(IIDC_EVENT_AFTER_MTU_CHANGE)) {
9462306a36Sopenharmony_ci		ibdev_dbg(&iwdev->ibdev, "CLNT: new MTU = %d\n", iwdev->netdev->mtu);
9562306a36Sopenharmony_ci		if (iwdev->vsi.mtu != iwdev->netdev->mtu) {
9662306a36Sopenharmony_ci			l2params.mtu = iwdev->netdev->mtu;
9762306a36Sopenharmony_ci			l2params.mtu_changed = true;
9862306a36Sopenharmony_ci			irdma_log_invalid_mtu(l2params.mtu, &iwdev->rf->sc_dev);
9962306a36Sopenharmony_ci			irdma_change_l2params(&iwdev->vsi, &l2params);
10062306a36Sopenharmony_ci		}
10162306a36Sopenharmony_ci	} else if (*event->type & BIT(IIDC_EVENT_BEFORE_TC_CHANGE)) {
10262306a36Sopenharmony_ci		if (iwdev->vsi.tc_change_pending)
10362306a36Sopenharmony_ci			return;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci		irdma_prep_tc_change(iwdev);
10662306a36Sopenharmony_ci	} else if (*event->type & BIT(IIDC_EVENT_AFTER_TC_CHANGE)) {
10762306a36Sopenharmony_ci		struct iidc_qos_params qos_info = {};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci		if (!iwdev->vsi.tc_change_pending)
11062306a36Sopenharmony_ci			return;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci		l2params.tc_changed = true;
11362306a36Sopenharmony_ci		ibdev_dbg(&iwdev->ibdev, "CLNT: TC Change\n");
11462306a36Sopenharmony_ci		ice_get_qos_params(pf, &qos_info);
11562306a36Sopenharmony_ci		irdma_fill_qos_info(&l2params, &qos_info);
11662306a36Sopenharmony_ci		if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
11762306a36Sopenharmony_ci			iwdev->dcb_vlan_mode = qos_info.num_tc > 1 && !l2params.dscp_mode;
11862306a36Sopenharmony_ci		irdma_change_l2params(&iwdev->vsi, &l2params);
11962306a36Sopenharmony_ci	} else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) {
12062306a36Sopenharmony_ci		ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr = 0x%08x\n",
12162306a36Sopenharmony_ci			   event->reg);
12262306a36Sopenharmony_ci		if (event->reg & IRDMAPFINT_OICR_PE_CRITERR_M) {
12362306a36Sopenharmony_ci			u32 pe_criterr;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci			pe_criterr = readl(iwdev->rf->sc_dev.hw_regs[IRDMA_GLPE_CRITERR]);
12662306a36Sopenharmony_ci#define IRDMA_Q1_RESOURCE_ERR 0x0001024d
12762306a36Sopenharmony_ci			if (pe_criterr != IRDMA_Q1_RESOURCE_ERR) {
12862306a36Sopenharmony_ci				ibdev_err(&iwdev->ibdev, "critical PE Error, GLPE_CRITERR=0x%08x\n",
12962306a36Sopenharmony_ci					  pe_criterr);
13062306a36Sopenharmony_ci				iwdev->rf->reset = true;
13162306a36Sopenharmony_ci			} else {
13262306a36Sopenharmony_ci				ibdev_warn(&iwdev->ibdev, "Q1 Resource Check\n");
13362306a36Sopenharmony_ci			}
13462306a36Sopenharmony_ci		}
13562306a36Sopenharmony_ci		if (event->reg & IRDMAPFINT_OICR_HMC_ERR_M) {
13662306a36Sopenharmony_ci			ibdev_err(&iwdev->ibdev, "HMC Error\n");
13762306a36Sopenharmony_ci			iwdev->rf->reset = true;
13862306a36Sopenharmony_ci		}
13962306a36Sopenharmony_ci		if (event->reg & IRDMAPFINT_OICR_PE_PUSH_M) {
14062306a36Sopenharmony_ci			ibdev_err(&iwdev->ibdev, "PE Push Error\n");
14162306a36Sopenharmony_ci			iwdev->rf->reset = true;
14262306a36Sopenharmony_ci		}
14362306a36Sopenharmony_ci		if (iwdev->rf->reset)
14462306a36Sopenharmony_ci			iwdev->rf->gen_ops.request_reset(iwdev->rf);
14562306a36Sopenharmony_ci	}
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/**
14962306a36Sopenharmony_ci * irdma_request_reset - Request a reset
15062306a36Sopenharmony_ci * @rf: RDMA PCI function
15162306a36Sopenharmony_ci */
15262306a36Sopenharmony_cistatic void irdma_request_reset(struct irdma_pci_f *rf)
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	struct ice_pf *pf = rf->cdev;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	ibdev_warn(&rf->iwdev->ibdev, "Requesting a reset\n");
15762306a36Sopenharmony_ci	ice_rdma_request_reset(pf, IIDC_PFR);
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci/**
16162306a36Sopenharmony_ci * irdma_lan_register_qset - Register qset with LAN driver
16262306a36Sopenharmony_ci * @vsi: vsi structure
16362306a36Sopenharmony_ci * @tc_node: Traffic class node
16462306a36Sopenharmony_ci */
16562306a36Sopenharmony_cistatic int irdma_lan_register_qset(struct irdma_sc_vsi *vsi,
16662306a36Sopenharmony_ci				   struct irdma_ws_node *tc_node)
16762306a36Sopenharmony_ci{
16862306a36Sopenharmony_ci	struct irdma_device *iwdev = vsi->back_vsi;
16962306a36Sopenharmony_ci	struct ice_pf *pf = iwdev->rf->cdev;
17062306a36Sopenharmony_ci	struct iidc_rdma_qset_params qset = {};
17162306a36Sopenharmony_ci	int ret;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	qset.qs_handle = tc_node->qs_handle;
17462306a36Sopenharmony_ci	qset.tc = tc_node->traffic_class;
17562306a36Sopenharmony_ci	qset.vport_id = vsi->vsi_idx;
17662306a36Sopenharmony_ci	ret = ice_add_rdma_qset(pf, &qset);
17762306a36Sopenharmony_ci	if (ret) {
17862306a36Sopenharmony_ci		ibdev_dbg(&iwdev->ibdev, "WS: LAN alloc_res for rdma qset failed.\n");
17962306a36Sopenharmony_ci		return ret;
18062306a36Sopenharmony_ci	}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	tc_node->l2_sched_node_id = qset.teid;
18362306a36Sopenharmony_ci	vsi->qos[tc_node->user_pri].l2_sched_node_id = qset.teid;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	return 0;
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/**
18962306a36Sopenharmony_ci * irdma_lan_unregister_qset - Unregister qset with LAN driver
19062306a36Sopenharmony_ci * @vsi: vsi structure
19162306a36Sopenharmony_ci * @tc_node: Traffic class node
19262306a36Sopenharmony_ci */
19362306a36Sopenharmony_cistatic void irdma_lan_unregister_qset(struct irdma_sc_vsi *vsi,
19462306a36Sopenharmony_ci				      struct irdma_ws_node *tc_node)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	struct irdma_device *iwdev = vsi->back_vsi;
19762306a36Sopenharmony_ci	struct ice_pf *pf = iwdev->rf->cdev;
19862306a36Sopenharmony_ci	struct iidc_rdma_qset_params qset = {};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	qset.qs_handle = tc_node->qs_handle;
20162306a36Sopenharmony_ci	qset.tc = tc_node->traffic_class;
20262306a36Sopenharmony_ci	qset.vport_id = vsi->vsi_idx;
20362306a36Sopenharmony_ci	qset.teid = tc_node->l2_sched_node_id;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	if (ice_del_rdma_qset(pf, &qset))
20662306a36Sopenharmony_ci		ibdev_dbg(&iwdev->ibdev, "WS: LAN free_res for rdma qset failed.\n");
20762306a36Sopenharmony_ci}
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cistatic void irdma_remove(struct auxiliary_device *aux_dev)
21062306a36Sopenharmony_ci{
21162306a36Sopenharmony_ci	struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev,
21262306a36Sopenharmony_ci							    struct iidc_auxiliary_dev,
21362306a36Sopenharmony_ci							    adev);
21462306a36Sopenharmony_ci	struct ice_pf *pf = iidc_adev->pf;
21562306a36Sopenharmony_ci	struct irdma_device *iwdev = auxiliary_get_drvdata(aux_dev);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	irdma_ib_unregister_device(iwdev);
21862306a36Sopenharmony_ci	ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, false);
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	pr_debug("INIT: Gen2 PF[%d] device remove success\n", PCI_FUNC(pf->pdev->devfn));
22162306a36Sopenharmony_ci}
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic void irdma_fill_device_info(struct irdma_device *iwdev, struct ice_pf *pf,
22462306a36Sopenharmony_ci				   struct ice_vsi *vsi)
22562306a36Sopenharmony_ci{
22662306a36Sopenharmony_ci	struct irdma_pci_f *rf = iwdev->rf;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	rf->cdev = pf;
22962306a36Sopenharmony_ci	rf->gen_ops.register_qset = irdma_lan_register_qset;
23062306a36Sopenharmony_ci	rf->gen_ops.unregister_qset = irdma_lan_unregister_qset;
23162306a36Sopenharmony_ci	rf->hw.hw_addr = pf->hw.hw_addr;
23262306a36Sopenharmony_ci	rf->pcidev = pf->pdev;
23362306a36Sopenharmony_ci	rf->msix_count =  pf->num_rdma_msix;
23462306a36Sopenharmony_ci	rf->pf_id = pf->hw.pf_id;
23562306a36Sopenharmony_ci	rf->msix_entries = &pf->msix_entries[pf->rdma_base_vector];
23662306a36Sopenharmony_ci	rf->default_vsi.vsi_idx = vsi->vsi_num;
23762306a36Sopenharmony_ci	rf->protocol_used = pf->rdma_mode & IIDC_RDMA_PROTOCOL_ROCEV2 ?
23862306a36Sopenharmony_ci			    IRDMA_ROCE_PROTOCOL_ONLY : IRDMA_IWARP_PROTOCOL_ONLY;
23962306a36Sopenharmony_ci	rf->rdma_ver = IRDMA_GEN_2;
24062306a36Sopenharmony_ci	rf->rsrc_profile = IRDMA_HMC_PROFILE_DEFAULT;
24162306a36Sopenharmony_ci	rf->rst_to = IRDMA_RST_TIMEOUT_HZ;
24262306a36Sopenharmony_ci	rf->gen_ops.request_reset = irdma_request_reset;
24362306a36Sopenharmony_ci	rf->limits_sel = 7;
24462306a36Sopenharmony_ci	rf->iwdev = iwdev;
24562306a36Sopenharmony_ci	mutex_init(&iwdev->ah_tbl_lock);
24662306a36Sopenharmony_ci	iwdev->netdev = vsi->netdev;
24762306a36Sopenharmony_ci	iwdev->vsi_num = vsi->vsi_num;
24862306a36Sopenharmony_ci	iwdev->init_state = INITIAL_STATE;
24962306a36Sopenharmony_ci	iwdev->roce_cwnd = IRDMA_ROCE_CWND_DEFAULT;
25062306a36Sopenharmony_ci	iwdev->roce_ackcreds = IRDMA_ROCE_ACKCREDS_DEFAULT;
25162306a36Sopenharmony_ci	iwdev->rcv_wnd = IRDMA_CM_DEFAULT_RCV_WND_SCALED;
25262306a36Sopenharmony_ci	iwdev->rcv_wscale = IRDMA_CM_DEFAULT_RCV_WND_SCALE;
25362306a36Sopenharmony_ci	if (rf->protocol_used == IRDMA_ROCE_PROTOCOL_ONLY)
25462306a36Sopenharmony_ci		iwdev->roce_mode = true;
25562306a36Sopenharmony_ci}
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_device_id *id)
25862306a36Sopenharmony_ci{
25962306a36Sopenharmony_ci	struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev,
26062306a36Sopenharmony_ci							    struct iidc_auxiliary_dev,
26162306a36Sopenharmony_ci							    adev);
26262306a36Sopenharmony_ci	struct ice_pf *pf = iidc_adev->pf;
26362306a36Sopenharmony_ci	struct ice_vsi *vsi = ice_get_main_vsi(pf);
26462306a36Sopenharmony_ci	struct iidc_qos_params qos_info = {};
26562306a36Sopenharmony_ci	struct irdma_device *iwdev;
26662306a36Sopenharmony_ci	struct irdma_pci_f *rf;
26762306a36Sopenharmony_ci	struct irdma_l2params l2params = {};
26862306a36Sopenharmony_ci	int err;
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	if (!vsi)
27162306a36Sopenharmony_ci		return -EIO;
27262306a36Sopenharmony_ci	iwdev = ib_alloc_device(irdma_device, ibdev);
27362306a36Sopenharmony_ci	if (!iwdev)
27462306a36Sopenharmony_ci		return -ENOMEM;
27562306a36Sopenharmony_ci	iwdev->rf = kzalloc(sizeof(*rf), GFP_KERNEL);
27662306a36Sopenharmony_ci	if (!iwdev->rf) {
27762306a36Sopenharmony_ci		ib_dealloc_device(&iwdev->ibdev);
27862306a36Sopenharmony_ci		return -ENOMEM;
27962306a36Sopenharmony_ci	}
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci	irdma_fill_device_info(iwdev, pf, vsi);
28262306a36Sopenharmony_ci	rf = iwdev->rf;
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	err = irdma_ctrl_init_hw(rf);
28562306a36Sopenharmony_ci	if (err)
28662306a36Sopenharmony_ci		goto err_ctrl_init;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	l2params.mtu = iwdev->netdev->mtu;
28962306a36Sopenharmony_ci	ice_get_qos_params(pf, &qos_info);
29062306a36Sopenharmony_ci	irdma_fill_qos_info(&l2params, &qos_info);
29162306a36Sopenharmony_ci	if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
29262306a36Sopenharmony_ci		iwdev->dcb_vlan_mode = l2params.num_tc > 1 && !l2params.dscp_mode;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	err = irdma_rt_init_hw(iwdev, &l2params);
29562306a36Sopenharmony_ci	if (err)
29662306a36Sopenharmony_ci		goto err_rt_init;
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	err = irdma_ib_register_device(iwdev);
29962306a36Sopenharmony_ci	if (err)
30062306a36Sopenharmony_ci		goto err_ibreg;
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, true);
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	ibdev_dbg(&iwdev->ibdev, "INIT: Gen2 PF[%d] device probe success\n", PCI_FUNC(rf->pcidev->devfn));
30562306a36Sopenharmony_ci	auxiliary_set_drvdata(aux_dev, iwdev);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	return 0;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cierr_ibreg:
31062306a36Sopenharmony_ci	irdma_rt_deinit_hw(iwdev);
31162306a36Sopenharmony_cierr_rt_init:
31262306a36Sopenharmony_ci	irdma_ctrl_deinit_hw(rf);
31362306a36Sopenharmony_cierr_ctrl_init:
31462306a36Sopenharmony_ci	kfree(iwdev->rf);
31562306a36Sopenharmony_ci	ib_dealloc_device(&iwdev->ibdev);
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	return err;
31862306a36Sopenharmony_ci}
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_cistatic const struct auxiliary_device_id irdma_auxiliary_id_table[] = {
32162306a36Sopenharmony_ci	{.name = "ice.iwarp", },
32262306a36Sopenharmony_ci	{.name = "ice.roce", },
32362306a36Sopenharmony_ci	{},
32462306a36Sopenharmony_ci};
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(auxiliary, irdma_auxiliary_id_table);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cistatic struct iidc_auxiliary_drv irdma_auxiliary_drv = {
32962306a36Sopenharmony_ci	.adrv = {
33062306a36Sopenharmony_ci	    .id_table = irdma_auxiliary_id_table,
33162306a36Sopenharmony_ci	    .probe = irdma_probe,
33262306a36Sopenharmony_ci	    .remove = irdma_remove,
33362306a36Sopenharmony_ci	},
33462306a36Sopenharmony_ci	.event_handler = irdma_iidc_event_handler,
33562306a36Sopenharmony_ci};
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cistatic int __init irdma_init_module(void)
33862306a36Sopenharmony_ci{
33962306a36Sopenharmony_ci	int ret;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	ret = auxiliary_driver_register(&i40iw_auxiliary_drv);
34262306a36Sopenharmony_ci	if (ret) {
34362306a36Sopenharmony_ci		pr_err("Failed i40iw(gen_1) auxiliary_driver_register() ret=%d\n",
34462306a36Sopenharmony_ci		       ret);
34562306a36Sopenharmony_ci		return ret;
34662306a36Sopenharmony_ci	}
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci	ret = auxiliary_driver_register(&irdma_auxiliary_drv.adrv);
34962306a36Sopenharmony_ci	if (ret) {
35062306a36Sopenharmony_ci		auxiliary_driver_unregister(&i40iw_auxiliary_drv);
35162306a36Sopenharmony_ci		pr_err("Failed irdma auxiliary_driver_register() ret=%d\n",
35262306a36Sopenharmony_ci		       ret);
35362306a36Sopenharmony_ci		return ret;
35462306a36Sopenharmony_ci	}
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	irdma_register_notifiers();
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci	return 0;
35962306a36Sopenharmony_ci}
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistatic void __exit irdma_exit_module(void)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	irdma_unregister_notifiers();
36462306a36Sopenharmony_ci	auxiliary_driver_unregister(&irdma_auxiliary_drv.adrv);
36562306a36Sopenharmony_ci	auxiliary_driver_unregister(&i40iw_auxiliary_drv);
36662306a36Sopenharmony_ci}
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_cimodule_init(irdma_init_module);
36962306a36Sopenharmony_cimodule_exit(irdma_exit_module);
370